打开失败:EACCES(拒绝权限)"用Xamarin录制音频

本文关键字:quot Xamarin 音频 失败 EACCES 权限 拒绝 | 更新日期: 2023-09-27 18:05:09

我正试图按照这个食谱用Xamarin录制音频。这是一个Xamarin。表单解决方案,但现在我只开发Android。我不得不说我是c#/。NET开发人员,这是我第一次接触Android。我在MicTest中创建了"Services"文件夹。Droid项目,我把我的服务放在那里:

[assembly: Dependency(typeof(MicrophoneService))]
namespace MicTest.Droid.Services
{
    public class MicrophoneService : IMicrophoneService
    {
        public string FileName { get; private set; }
        public string FilePath { get { return Path.Combine("data", $"{this.FileName}.3gpp"); } }
        private MediaRecorder recorder;
        public MicrophoneService() { }
        public void StartRecording(string fileName)
        {
            try
            {
                this.FileName = fileName;
                //bool exist = Directory.Exists("data");
                this.recorder = new MediaRecorder();
                this.recorder.SetAudioSource(AudioSource.Mic);
                this.recorder.SetOutputFormat(OutputFormat.ThreeGpp);
                this.recorder.SetAudioEncoder(AudioEncoder.AmrNb);
                this.recorder.SetOutputFile(this.FilePath);
                this.recorder.Prepare(); // It crashes here
                this.recorder.Start();
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
                Console.WriteLine(ex.StackTrace);
            }
        }
        public void StopRecording()
        {
            try
            {
                this.recorder.Stop();
                this.recorder.Reset();
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
                Console.WriteLine(ex.StackTrace);
            }
        }
    }
}

IMicrophoneService接口在共享项目中:

namespace MicTest.Services
{
    public interface IMicrophoneService
    {
        void StartRecording(string fileName);
        void StopRecording();
    }
}

下面是异常:

data/2016-08-31 16.22.58.3gpp: open failed: EACCES(Permission denied)
  at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() [0x0000c] in /Users/builder/data/lanes/2923/52635947/source/mono/external/referencesource/mscorlib/system/runtime/exceptionservices/exceptionservicescommon.cs:143 
  at Java.Interop.JniEnvironment+InstanceMethods.CallVoidMethod (JniObjectReference instance, Java.Interop.JniMethodInfo method, Java.Interop.JniArgumentValue* args) [0x00084] in /Users/builder/data/lanes/3340/4e275588/source/Java.Interop/src/Java.Interop/Java.Interop/JniEnvironment.g.cs:11643 
  at Java.Interop.JniPeerMembers+JniInstanceMethods.InvokeVirtualVoidMethod (System.String encodedMember, IJavaPeerable self, Java.Interop.JniArgumentValue* parameters) [0x00031] in /Users/builder/data/lanes/3340/4e275588/source/Java.Interop/src/Java.Interop/Java.Interop/JniPeerMembers.JniInstanceMethods_Invoke.cs:26 
  at Android.Media.MediaRecorder.Prepare() [0x00000] in /Users/builder/data/lanes/3340/4e275588/source/monodroid/src/Mono.Android/platforms/android-23/src/generated/Android.Media.MediaRecorder.cs:476 
  at MicTest.Droid.Services.MicrophoneService.StartRecording(System.String fileName) [0x0006f] in F:'Probak'Xamarin'MicTest'MicTest'MicTest.Droid'Services'MicrophoneService.cs:53       --- End of managed exception stack trace ---
java.io.FileNotFoundException: data/2016-08-31 16.22.58.3gpp: open failed: EACCES(Permission denied)
    at libcore.io.IoBridge.open(IoBridge.java:456)
    at java.io.RandomAccessFile.<init>(RandomAccessFile.java:117)
    at java.io.RandomAccessFile.<init>(RandomAccessFile.java:149)
    at android.media.MediaRecorder.prepare(MediaRecorder.java:750)
    at md5b60ffeb829f638581ab2bb9b1a7f4f3f.ButtonRenderer_ButtonClickListener.n_onClick(Native Method)
    at md5b60ffeb829f638581ab2bb9b1a7f4f3f.ButtonRenderer_ButtonClickListener.onClick(ButtonRenderer_ButtonClickListener.java:30)
    at android.view.View.performClick(View.java:4763)
    at android.view.View$PerformClick.run(View.java:19821)
    at android.os.Handler.handleCallback(Handler.java:739)
    at android.os.Handler.dispatchMessage(Handler.java:95)
    at android.os.Looper.loop(Looper.java:135)
    at android.app.ActivityThread.main(ActivityThread.java:5272)
    at java.lang.reflect.Method.invoke(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:372)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:909)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:704)
Caused by: android.system.ErrnoException: open failed: EACCES(Permission denied)
    at libcore.io.Posix.open(Native Method)
    at libcore.io.BlockGuardOs.open(BlockGuardOs.java:186)
    at libcore.io.IoBridge.open(IoBridge.java:442)
    ... 15 more

最后,这是清单文件(在未来我想使用位置服务):

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:installLocation="auto">
    <uses-sdk android:minSdkVersion="15" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.RECORD_AUDIO" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <application android:label="$safeprojectname$"></application>
</manifest>

我不知道我是否可以使用"data"文件夹,我尝试了其他文件夹,如Android.OS.Environment.DirectoryDownloads,结果相同。我忘了什么吗?

打开失败:EACCES(拒绝权限)"用Xamarin录制音频

你可以尝试保存到你的应用程序的缓存目录来验证你的权限:

var fileName = "audio.3gpp";
fileName = Path.Combine(Android.Content.Context.CacheDir.Path, fileName)
this.FileName = fileName;