2

最初の Mono for Android アプリケーションを作成しようとしていますが、sdcard との間で読み取りまたは書き込みをしようとすると、アクセス許可エラーが発生しました。そこで、SanityTests の xamarin-monodroid-samples-d76baf3 に切り替えました。

Example_WorkingWithAudio RecordAudio.cs は内部ストレージで正常に動作します。また、マニフェストで適用される WRITE_EXTERNAL_STORAGE 権限も持っています。そのため、次の行のコメントを外しました。

Java.IO.File sdDir = Android.OS.Environment.GetExternalStoragePublicDirectory(Android.OS.Environment.DirectoryMusic);
filePath = sdDir + "/" + "testAudio.mp3";

そのため、コードは次のようになります。

Java.IO.File sdDir = Android.OS.Environment.GetExternalStoragePublicDirectory(Android.OS.Environment.DirectoryMusic);
filePath = sdDir + "/" + "testAudio.mp3";
Java.IO.File myFile = new Java.IO.File(filePath);
myFile.CreateNewFile();

Android 2.3.4 を実行する Sony Ericsson Xperia Mini Pro でこれを実行しています。

実行が CreateNewFile() 行に到達すると、filePath の値は "/mnt/sdcard/Music/testAudio.mp3" になります。

次に、このエラーがスローされます。

Java.IO.IOException: Exception of type 'Java.IO.IOException' was thrown.
  at Android.Runtime.JNIEnv.CallBooleanMethod (IntPtr jobject, IntPtr jmethod) [0x00023] in /Users/builder/data/lanes/monodroid-mac-monodroid-4.2.6-

branch/632e6ddf/source/monodroid/src/Mono.Android/src/Runtime/JNIEnv.g.cs:156 
  at Java.IO.File.CreateNewFile () [0x0003e] in /Users/builder/data/lanes/monodroid-mac-monodroid-4.2.6-

branch/632e6ddf/source/monodroid/src/Mono.Android/platforms/android-8/src/generated/Java.IO.File.cs:771 
  at Example_WorkingWithAudio.RecordAudio.StartRecorder () [0x00044] in c:\Users\Matt\Downloads\xamarin-monodroid-samples-d76baf3\xamarin-monodroid-samples-

d76baf3\Example_WorkingWithAudio\Example_WorkingWithAudio\RecordAudio.cs:35 
  --- End of managed exception stack trace ---
java.io.IOException: Permission denied
    at java.io.File.createNewFileImpl(Native Method)
    at java.io.File.createNewFile(File.java:1257)
    at mono.android.view.View_OnClickListenerImplementor.n_onClick(Native Method)
    at mono.android.view.View_OnClickListenerImplementor.onClick(View_OnClickListenerImplementor.java:29)
    at android.view.View.performClick(View.java:2552)
    at android.view.View$PerformClick.run(View.java:9229)
    at android.os.Handler.handleCallback(Handler.java:587)
    at android.os.Handler.dispatchMessage(Handler.java:92)
    at android.os.Looper.loop(Looper.java:130)
    at android.app.ActivityThread.main(ActivityThread.java:3701)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:507)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:866)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:624)
    at dalvik.system.NativeStart.main(Native Method)

問題は何ですか?

参考までに、.Net クラスも使用してみました。

FileStream fileStream = File.Create(filePath);

(filePath は「/mnt/sdcard/Music/testAudio.mp3」のままです)

しかし、その行は例外を与えます:

System.IO.DirectoryNotFoundException: Could not find a part of the path "/mnt/sdcard/Music/testAudio.mp3".
  at System.IO.FileStream..ctor (System.String path, FileMode mode, FileAccess access, FileShare share, Int32 bufferSize, Boolean anonymous, FileOptions options) [0x00000] in <filename unknown>:0
  at System.IO.FileStream..ctor (System.String path, FileMode mode, FileAccess access, FileShare share, Int32 bufferSize) [0x00000] in <filename unknown>:0
  at System.IO.File.Create (System.String path, Int32 bufferSize) [0x00000] in <filename unknown>:0
  at System.IO.File.Create (System.String path) [0x00000] in <filename unknown>:0
  at Example_WorkingWithAudio.RecordAudio.StartRecorder () [0x0001d] in c:\Users\Matt\Downloads\xamarin-monodroid-samples-d76baf3\xamarin-monodroid-samples-d76baf3\Example_WorkingWithAudio\Example_WorkingWithAudio\RecordAudio.cs:33
4

4 に答える 4

11

これが、Mono for Android でこれを行った方法です。

var path = Android.OS.Environment.ExternalStorageDirectory.AbsolutePath;

path = Path.Combine(path, "testaudio.mp3");
于 2012-12-19T10:23:05.320 に答える
4

私は同じ例外に遭遇していましたが、最終的に次のようにして解決しました:

  1. エミュレータ用の sdcard ファイルを作成します。これを行う方法を説明する簡単なチュートリアルを投稿しました。
  2. 以下のコード (C#) を使用して、SD カードにファイルを書き込むことができました。

    string pathToFile = Path.Combine(Android.OS.Environment.ExternalStorageDirectory.AbsolutePath, _fileName);
    using(var fileStream = new FileStream(pathToFile, FileMode.Append, FileAccess.Write, FileShare.None))
    {
        fileStream.Write(Encoding.ASCII.GetBytes(message), 0, Encoding.ASCII.GetByteCount(message));
    }
    
于 2012-12-21T21:14:14.097 に答える
-1

このパスを試してください:

String filePath = Environment.getExternalStorageDirectory() + "/testAudio.mp3";
File mFile = new File(filePath);
于 2012-10-30T06:02:22.347 に答える