File io Android外部(SD卡)文件IO的Mono

File io Android外部(SD卡)文件IO的Mono,file-io,xamarin.android,android-sdcard,xamarin,File Io,Xamarin.android,Android Sdcard,Xamarin,我正在尝试创建我的第一个Mono for Android应用程序,在尝试从SD卡读取或写入SD卡时出现权限错误。所以我换成了卫生测试,xamarin-monodroid-samples-d76baf3 示例_使用Audio RecordAudio.cs在内部存储器上成功运行。它还具有在清单中应用的写入外部存储权限;因此,我随后取消了这些行的注释: Java.IO.File sdDir = Android.OS.Environment.GetExternalStoragePublicDirecto

我正在尝试创建我的第一个Mono for Android应用程序,在尝试从SD卡读取或写入SD卡时出现权限错误。所以我换成了卫生测试,xamarin-monodroid-samples-d76baf3

示例_使用Audio RecordAudio.cs在内部存储器上成功运行。它还具有在清单中应用的写入外部存储权限;因此,我随后取消了这些行的注释:

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();
我正在运行安卓2.3.4的索尼爱立信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);
(其中文件路径仍然为“/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
System.IO.DirectoryNotFoundException:找不到路径“/mnt/sdcard/Music/testAudio.mp3”的一部分。
在System.IO.FileStream..ctor(System.String路径、FileMode模式、FileAccess访问、FileShare共享、Int32 bufferSize、布尔匿名、FileOptions选项)[0x00000]中:0
在System.IO.FileStream..ctor(System.String路径、FileMode模式、FileAccess访问、FileShare共享、Int32 bufferSize)[0x00000]中:0
在System.IO.File.Create(System.String路径,Int32 bufferSize)[0x00000]中:0
在:0中的System.IO.File.Create(System.String路径)[0x00000]处
在c:\Users\Matt\Downloads\xamarin-monodroid-samples-d76baf3\xamarin-monodroid-samples-d76baf3\Example\u-WorkingWithAudio\Example\u-WorkingWithAudio\RecordAudio.cs:33中的示例\u-WorkingWithAudio.RecordAudio.StartRecorder()[0x0001d]
尝试以下路径:

String filePath=Environment.getExternalStorageDirectory()+“/testAudio.mp3”;
File mFile=新文件(filePath);

这就是我在Mono for Android中所做的

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

path = Path.Combine(path, "testaudio.mp3");

我遇到了相同的异常,最后通过执行以下操作解决了该异常:

  • 为模拟器创建SD卡文件。我写了一篇文章,描述了如何做到这一点
  • 使用下面的代码(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));
    }
    

  • 如果您试图从带有xamarin表单的服务器下载或获取图像,您可以使用以下方法:

    File.WriteAllBytes("myimage.png",
    new WebClient().DownloadData(http://www.dotnetperls.com/net.png));
    

    您有一条可变名称消息:这到底是什么?@Mario
    message
    是我要写入文件的字符串。上面的代码片段可以放在类似于
    public void Write(string message)
    的方法中。您是否解决过这个问题?