Создание каталога на внешней SD-карте. (ошибка доступа к записи)

Я выполнил этот урок: https://www.youtube.com/watch?v=Uzpy3qdYXmE, чтобы получить разрешение на запись и чтение на внешнюю SD-карту, используя путь: / storage / XXXX-XXXX /. Но даже несмотря на то, что код, похоже, рад предоставить мне разрешения, я все равно получаю доступ к отказам при записи на SD-карту (например, при создании каталога).

Это происходит на Android 7.0 (Custom rom).

Просто для того, чтобы усложнить ситуацию, создание каталога происходит в отдельной созданной библиотеке, которая должна работать с межплатформенной платформой. Я использую символы компиляции для компиляции библиотеки для определенных платформ.

Само приложение - это приложение WebView, которое взаимодействует с кодом в библиотеке через сервер websocket, инициированный библиотекой.

Моя первоначальная идея заключалась в том, чтобы запросить все необходимые разрешения в MainActivity, и это было бы так. Но, видимо, я что-то упускаю.

Вот сообщение об ошибке:

System.UnauthorizedAccessException: Access to the path "/storage/09F6-DC14/Test" is denied.
at System.IO.Directory.CreateDirectoriesInternal (System.String path) [0x0004b] in <fd78fee11d3a4b2b99a184d3a0faf63e>:0 
at System.IO.Directory.CreateDirectory (System.String path) [0x00075] in <fd78fee11d3a4b2b99a184d3a0faf63e>:0 
at Library.Handlers.DirectoryHandler.CreateDirectory (System.String path, System.String name) [0x000db] in

Вот мой файл манифеста:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"     package="TestApp.TestApp" android:versionCode="1"     android:versionName="0.0.1 Preview Version -WIP"     android:installLocation="preferExternal">
    <uses-sdk android:targetSdkVersion="24" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.MANAGE_DOCUMENTS" />
    <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
    <uses-permission android:name="android.permission.MOUNT_FORMAT_FILESYSTEMS" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <application android:label="TestApp" android:hardwareAccelerated="true"></application>
</manifest>

Вот AssemblyInfo.cs:

using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using Android.App;

// General Information about an assembly is controlled through the following 
// set of attributes. Change these attribute values to modify the information
// associated with an assembly.
[assembly: AssemblyTitle("TestApp")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("TestApp")]
[assembly: AssemblyCopyright("Copyright A©  2018")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
[assembly: ComVisible(false)]

// Version information for an assembly consists of the following four values:
//
//      Major Version
//      Minor Version 
//      Build Number
//      Revision
//
// You can specify all the values or you can default the Build and Revision Numbers 
// by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]


[assembly: UsesPermission(Android.Manifest.Permission.WriteExternalStorage)]
[assembly: UsesPermission(Android.Manifest.Permission.ReadExternalStorage)]

Вот код, который запрашивает разрешения (измененный из кода, используемого в вышеупомянутом учебнике):

MainActivity.cs:

    readonly string[] PermissionsGroupExternalStorage=
    {
                //TODO add more permissions
                Manifest.Permission.ReadExternalStorage,
                Manifest.Permission.WriteExternalStorage
    };


    async Task GetPermissionsAsync()
    {
        const string permissionRead = Manifest.Permission.ReadExternalStorage;
        const string permissionWrite = Manifest.Permission.WriteExternalStorage;

        if  ((CheckSelfPermission(permissionRead) == (int)Android.Content.PM.Permission.Granted) && (CheckSelfPermission(permissionWrite) == (int)Android.Content.PM.Permission.Granted))
        {
            //TODO change the message to show the permissions name
            Toast.MakeText(this, "Storage permissions granted.", ToastLength.Short).Show();
            return;
        } else 
        {

            Toast.MakeText(this, "Storage permissions not granted.", ToastLength.Short).Show();
            //set alert for executing the task
            AlertDialog.Builder alert = new AlertDialog.Builder(this);
            alert.SetTitle("Storage Permissions Needed");
            alert.SetMessage("The application need special permissions to read and write to (external) storage devices to continue");
            alert.SetPositiveButton("Request Permissions", (senderAlert, args) =>
            {
                RequestPermissions(PermissionsGroupExternalStorage, RequestLocationId);
            });

            alert.SetNegativeButton("Cancel", (senderAlert, args) =>
            {
                Toast.MakeText(this, "Cancelled!", ToastLength.Short).Show();
            });

            Dialog dialog = alert.Create();
            dialog.Show();


        }

        RequestPermissions(PermissionsGroupExternalStorage, RequestLocationId);

        return;
    }

И тогда я просто пытаюсь создать каталог (в библиотеке кроссплатформы (ish)) со следующим кодом:

DirectoryHandler Класс в моей библиотеке:

Directory.CreateDirectory("/storage/09F6-DC14/Test")

Очевидно, что есть улучшения, которые могут быть сделаны с кодом, но я хочу, чтобы он работал сначала ...

Тост возвращает «Разрешение на хранение», поэтому я считаю, что у меня есть права, установленные правильно, вот что мешает мне решить это, если это не из-за разрешений ... что еще может заблокировать меня от доступа к моему внешнему место хранения?

Возможно ли, что я действительно должен запрашивать разрешение каждый раз, когда пытаюсь писать / читать с / на внешнее устройство хранения? Кажется, что это взломать.

c#,android,xamarin,android-external-storage,

0

Ответов: 0

Создание каталога на внешней SD-карте. (ошибка доступа к записи)

Я выполнил этот урок: https://www.youtube.com/watch?v=Uzpy3qdYXmE, чтобы получить разрешение на запись и чтение на внешнюю SD-карту, используя путь: / storage / XXXX-XXXX /. Но даже несмотря на то, что код, похоже, рад предоставить мне разрешения, я все равно получаю доступ к отказам при записи на SD-карту (например, при создании каталога).

Это происходит на Android 7.0 (Custom rom).

Просто для того, чтобы усложнить ситуацию, создание каталога происходит в отдельной созданной библиотеке, которая должна работать с межплатформенной платформой. Я использую символы компиляции для компиляции библиотеки для определенных платформ.

Само приложение - это приложение WebView, которое взаимодействует с кодом в библиотеке через сервер websocket, инициированный библиотекой.

Моя первоначальная идея заключалась в том, чтобы запросить все необходимые разрешения в MainActivity, и это было бы так. Но, видимо, я что-то упускаю.

Вот сообщение об ошибке:

System.UnauthorizedAccessException: Access to the path "/storage/09F6-DC14/Test" is denied.
at System.IO.Directory.CreateDirectoriesInternal (System.String path) [0x0004b] in <fd78fee11d3a4b2b99a184d3a0faf63e>:0 
at System.IO.Directory.CreateDirectory (System.String path) [0x00075] in <fd78fee11d3a4b2b99a184d3a0faf63e>:0 
at Library.Handlers.DirectoryHandler.CreateDirectory (System.String path, System.String name) [0x000db] in

Вот мой файл манифеста:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"     package="TestApp.TestApp" android:versionCode="1"     android:versionName="0.0.1 Preview Version -WIP"     android:installLocation="preferExternal">
    <uses-sdk android:targetSdkVersion="24" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.MANAGE_DOCUMENTS" />
    <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
    <uses-permission android:name="android.permission.MOUNT_FORMAT_FILESYSTEMS" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <application android:label="TestApp" android:hardwareAccelerated="true"></application>
</manifest>

Вот AssemblyInfo.cs:

using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using Android.App;

// General Information about an assembly is controlled through the following 
// set of attributes. Change these attribute values to modify the information
// associated with an assembly.
[assembly: AssemblyTitle("TestApp")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("TestApp")]
[assembly: AssemblyCopyright("Copyright A©  2018")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
[assembly: ComVisible(false)]

// Version information for an assembly consists of the following four values:
//
//      Major Version
//      Minor Version 
//      Build Number
//      Revision
//
// You can specify all the values or you can default the Build and Revision Numbers 
// by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]


[assembly: UsesPermission(Android.Manifest.Permission.WriteExternalStorage)]
[assembly: UsesPermission(Android.Manifest.Permission.ReadExternalStorage)]

Вот код, который запрашивает разрешения (измененный из кода, используемого в вышеупомянутом учебнике):

MainActivity.cs:

    readonly string[] PermissionsGroupExternalStorage=
    {
                //TODO add more permissions
                Manifest.Permission.ReadExternalStorage,
                Manifest.Permission.WriteExternalStorage
    };


    async Task GetPermissionsAsync()
    {
        const string permissionRead = Manifest.Permission.ReadExternalStorage;
        const string permissionWrite = Manifest.Permission.WriteExternalStorage;

        if  ((CheckSelfPermission(permissionRead) == (int)Android.Content.PM.Permission.Granted) && (CheckSelfPermission(permissionWrite) == (int)Android.Content.PM.Permission.Granted))
        {
            //TODO change the message to show the permissions name
            Toast.MakeText(this, "Storage permissions granted.", ToastLength.Short).Show();
            return;
        } else 
        {

            Toast.MakeText(this, "Storage permissions not granted.", ToastLength.Short).Show();
            //set alert for executing the task
            AlertDialog.Builder alert = new AlertDialog.Builder(this);
            alert.SetTitle("Storage Permissions Needed");
            alert.SetMessage("The application need special permissions to read and write to (external) storage devices to continue");
            alert.SetPositiveButton("Request Permissions", (senderAlert, args) =>
            {
                RequestPermissions(PermissionsGroupExternalStorage, RequestLocationId);
            });

            alert.SetNegativeButton("Cancel", (senderAlert, args) =>
            {
                Toast.MakeText(this, "Cancelled!", ToastLength.Short).Show();
            });

            Dialog dialog = alert.Create();
            dialog.Show();


        }

        RequestPermissions(PermissionsGroupExternalStorage, RequestLocationId);

        return;
    }

И тогда я просто пытаюсь создать каталог (в библиотеке кроссплатформы (ish)) со следующим кодом:

DirectoryHandler Класс в моей библиотеке:

Directory.CreateDirectory("/storage/09F6-DC14/Test")

Очевидно, что есть улучшения, которые могут быть сделаны с кодом, но я хочу, чтобы он работал сначала ...

Тост возвращает «Разрешение на хранение», поэтому я считаю, что у меня есть права, установленные правильно, вот что мешает мне решить это, если это не из-за разрешений ... что еще может заблокировать меня от доступа к моему внешнему место хранения?

Возможно ли, что я действительно должен запрашивать разрешение каждый раз, когда пытаюсь писать / читать с / на внешнее устройство хранения? Кажется, что это взломать.

00C #, андроид, Xamarin, андроид-внешнего хранения данных,
Похожие вопросы