Я выполнил этот урок: 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,
Я выполнил этот урок: 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, андроид-внешнего хранения данных,