访问路径被拒绝(Xamarin/Android)

Posted

技术标签:

【中文标题】访问路径被拒绝(Xamarin/Android)【英文标题】:Access to path denied (Xamarin/Android) 【发布时间】:2017-11-29 10:20:53 【问题描述】:

我正在运行 Windows 10、Visual Studio 2015 和 Xamarin。我对 Xamarin 相当陌生(只是为了设置地面)。我最近更新后目前遇到问题。我的应用程序在更新之前工作。我所有的文件都是只读的,在更新之前我没有任何问题。除此之外,我已经重建了项目,并且我也为项目“清理并重建”。我已经用我拥有的多个应用程序进行了尝试,其他应用程序没有这个问题。我在下面收到以下错误的问题。

06-26 13:51:55.108 I/MonoDroid( 6985): UNHANDLED EXCEPTION:
06-26 13:51:55.142 I/MonoDroid( 6985): System.UnauthorizedAccessException: Access to the path "/storage/emulated/0/defaultDirectory/users.ini" is denied.
06-26 13:51:55.142 I/MonoDroid( 6985):   at System.IO.FileStream..ctor (System.String path, System.IO.FileMode mode, System.IO.FileAccess access, System.IO.FileShare share, System.Int32 bufferSize, System.Boolean anonymous, System.IO.FileOptions options) [0x001f1] in <3fd174ff54b146228c505f23cf75ce71>:0 
06-26 13:51:55.142 I/MonoDroid( 6985):   at System.IO.FileStream..ctor (System.String path, System.IO.FileMode mode, System.IO.FileAccess access, System.IO.FileShare share, System.Int32 bufferSize, System.IO.FileOptions options, System.String msgPath, System.Boolean bFromProxy, System.Boolean useLongPath, System.Boolean checkHost) [0x00000] in <3fd174ff54b146228c505f23cf75ce71>:0 
06-26 13:51:55.142 I/MonoDroid( 6985):   at (wrapper remoting-invoke-with-check) System.IO.FileStream:.ctor (string,System.IO.FileMode,System.IO.FileAccess,System.IO.FileShare,int,System.IO.FileOptions,string,bool,bool,bool)
06-26 13:51:55.142 I/MonoDroid( 6985):   at System.IO.StreamReader..ctor (System.String path, System.Text.Encoding encoding, System.Boolean detectEncodingFromByteOrderMarks, System.Int32 bufferSize, System.Boolean checkHost) [0x00067] in <3fd174ff54b146228c505f23cf75ce71>:0 
06-26 13:51:55.142 I/MonoDroid( 6985):   at System.IO.StreamReader..ctor (System.String path, System.Text.Encoding encoding, System.Boolean detectEncodingFromByteOrderMarks, System.Int32 bufferSize) [0x00000] in <3fd174ff54b146228c505f23cf75ce71>:0 
06-26 13:51:55.142 I/MonoDroid( 6985):   at System.IO.StreamReader..ctor (System.String path, System.Boolean detectEncodingFromByteOrderMarks) [0x0000d] in <3fd174ff54b146228c505f23cf75ce71>:0 
06-26 13:51:55.142 I/MonoDroid( 6985):   at System.IO.StreamReader..ctor (System.String path) [0x00000] in <3fd174ff54b146228c505f23cf75ce71>:0 
06-26 13:51:55.142 I/MonoDroid( 6985):   at (wrapper remoting-invoke-with-check) System.IO.StreamReader:.ctor (string)
06-26 13:51:55.142 I/MonoDroid( 6985):   at System.IO.File.OpenText (System.String path) [0x00000] in <3fd174ff54b146228c505f23cf75ce71>:0 
06-26 13:51:55.142 I/MonoDroid( 6985):   at QykandroidApp.AdminLoginActivity.decryptUsers () [0x00033] in <65a7af1659a443738d96e6c2b7534ab2>:0 
06-26 13:51:55.142 I/MonoDroid( 6985):   at QykAndroidApp.AdminLoginActivity.OnCreate (Android.OS.Bundle savedInstanceState) [0x0008a] in <65a7af1659a443738d96e6c2b7534ab2>:0 
06-26 13:51:55.142 I/MonoDroid( 6985):   at Android.App.Activity.n_OnCreate_Landroid_os_Bundle_ (System.IntPtr jnienv, System.IntPtr native__this, System.IntPtr native_savedInstanceState) [0x0000f] in <d855bac285f44dda8a0d8510b679b1e2>:0 
06-26 13:51:55.142 I/MonoDroid( 6985):   at (wrapper dynamic-method) System.Object:28564880-3429-412d-9c61-4f5bb9fc103e (intptr,intptr,intptr)
06-26 13:51:55.153 W/art     ( 6985): JNI RegisterNativeMethods: attempt to register 0 native methods for android.runtime.JavaProxyThrowable
An unhandled exception occured.

我读过几篇文章,例如(我发布了谷歌搜索第 3 项,因为我几乎阅读了顶部结果中的所有内容)。我已经尝试以管理员身份运行该程序,并且该目录对任何人都具有开放访问权限。

Why is access to the path denied? System.UnauthorizedAccessException: Access to the path "..." is denied https://www.google.com/search?q=RegisterNativeMethods%3A+attempt+to+register+0+native+methods+for+android.runtime.JavaProxyThrowable&oq=RegisterNativeMethods%3A+attempt+to+register+0+native+methods+for+android.runtime.JavaProxyThrowable&aqs=chrome..69i57j69i58.572j0j7&sourceid=chrome&ie=UTF-8

对于任何对我如何访问我的文件的代码感兴趣的人,它在下面。

 private List<string> readUsers()
    
        adminUsers = new List<string>();
        try
        
            StreamReader readerForFile;

            //create checks for making sure the card is mounted, the directory is found, and the file is found. 
            var filePath = Path.Combine(Android.OS.Environment.ExternalStorageDirectory.Path, "defaultDirectory/users.ini");

            File.SetAttributes(filePath, FileAttributes.Normal);

            if (File.Exists(filePath))
            
                //Reads enttire document
                //var fillContent = File.ReadAllText(filePath);
                readerForFile = File.OpenText(filePath);
                if (readerForFile == null)  return null; 
                else
                
                    string line = "";
                    int counter = 0;
                    while ((line = readerForFile.ReadLine()) != null)
                    
                        adminUsers.Add(line);
                        counter++;
                    
                
            

        
        catch (IOException e)
        
            //You'll need to add proper error handling here
            alert.SetMessage("File was not found. " + e).SetNeutralButton("Okay", delegate  QuestionActivity.exit(); ).Create().Show();
        

        return adminUsers;
    

【问题讨论】:

"我的应用程序在更新前工作正常。"您可以尝试从设备上卸载您的应用并重新部署。 【参考方案1】:

您应该在 Android 中启用 READ_EXTERNAL_STORAGE 和 WRITE_EXTERNAL_STORAGE 权限。 您可以关注此博客以在运行时启用权限 https://devblogs.microsoft.com/xamarin/requesting-runtime-permissions-in-android-marshmallow/

【讨论】:

以上是关于访问路径被拒绝(Xamarin/Android)的主要内容,如果未能解决你的问题,请参考以下文章

将 WCF 连接到 Xamarin.Android 项目时出现连接被拒绝错误

“对路径的访问被拒绝.” 是怎么回事

“对路径的访问被拒绝.” 是怎么回事

vs2022路径拒绝访问

对路径的访问被拒绝,怎么解决

对路径的访问被拒绝怎么办?