#c# #android #xamarin.forms #android-11
Вопрос:
У меня есть такой код, в котором я получаю права на запись во внешнее хранилище. Там я также проверяю, было ли получено это разрешение.
private void ExternalStoragePermission()
{
ActivityCompat.RequestPermissions(this,
new String[]{Manifest.Permission.ReadExternalStorage,
Manifest.Permission.ManageExternalStorage}, 1);
//Android 11
if (Build.VERSION.SdkInt >= Android.OS.BuildVersionCodes.R)
{
if (!Android.OS.Environment.IsExternalStorageManager)
{
try
{
Intent intent = new Intent(Android.Provider.Settings.ActionManageAllFilesAccessPermission);
intent.AddCategory("android.intent.category.DEFAULT");
intent.SetData(Android.Net.Uri.Parse(String.Format("package:%s", new object[] { Application.Context.PackageName })));
StartActivityForResult(intent, 2000);
}
catch (Exception e)
{
Intent intent = new Intent();
intent.SetAction(Android.Provider.Settings.ActionManageAllFilesAccessPermission);
StartActivityForResult(intent, 2000);
}
}
}
//Below Android 11
else
{
if ((ContextCompat.CheckSelfPermission(this, Manifest.Permission.WriteExternalStorage) != (int)Permission.Granted)
|| (ContextCompat.CheckSelfPermission(this, Manifest.Permission.ReadExternalStorage) != (int)Permission.Granted))
{
ActivityCompat.RequestPermissions(this, new string[] { Manifest.Permission.ReadExternalStorage, Manifest.Permission.WriteExternalStorage }, 0);
}
}
}
Даже если у меня есть это разрешение, я все равно не могу загружать файлы во внешнее хранилище
У меня нет идей, пожалуйста, помогите мне
Комментарии:
1. Я могу создавать папки, но я не могу работать с файлами
2. Покажите свой код. Мы понятия не имеем, чего вы хотите или пытались.
3.
//Below Android 11
Вы должны запросить и получить это тоже за 11.4. Вам не нужно разрешение на все файлы для Android 11 и 12, чтобы создавать файлы в каталоге общедоступных документов.
Ответ №1:
Android 10 представил новую парадигму хранения для приложений под названием хранилище с областью действия, которая изменяет способ хранения приложений и доступа к файлам на внешнем хранилище устройства. Если вы нацелены на Android 10 (уровень API 29) или выше, установите значение requestLegacyExternalStorage равным true в файле манифеста вашего приложения.
<application android:requestLegacyExternalStorage="true" android:label="FormsSample.Android" android:theme="@style/MainTheme"></application>
Затем добавьте разрешение READ_EXTERNAL_STORAGE и WRITE_EXTERNAL_STORAGE в AndroidManifest.xml
Наконец, я делаю один пример, чтобы сохранить файл txt в папке загрузки.
public class MainActivity : AppCompatActivity
{
private Button btn1;
protected override void OnCreate(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
Xamarin.Essentials.Platform.Init(this, savedInstanceState);
// Set our view from the "main" layout resource
SetContentView(Resource.Layout.activity_main);
btn1 = FindViewById<Button>(Resource.Id.button1);
btn1.Click = Btn1_Click;
}
private void Btn1_Click(object sender, System.EventArgs e)
{
requestpermission();
CreateFile("test.txt");
}
public void CreateFile(string FileName)
{
string text = "hello world";
byte[] data = Encoding.ASCII.GetBytes(text);
string rootPath = Path.Combine(Android.OS.Environment.ExternalStorageDirectory.AbsolutePath, Android.OS.Environment.DirectoryDownloads);
var filePathDir = Path.Combine(rootPath, "folder");
if (!File.Exists(filePathDir))
{
Directory.CreateDirectory(filePathDir);
}
string filePath = Path.Combine(filePathDir, FileName);
File.WriteAllBytes(filePath, data);
}
public void requestpermission()
{
if (ContextCompat.CheckSelfPermission(this, Manifest.Permission.WriteExternalStorage) != (int)Permission.Granted)
{
ActivityCompat.RequestPermissions(this, new string[] { Manifest.Permission.WriteExternalStorage }, 1);
}
if (ContextCompat.CheckSelfPermission(this, Manifest.Permission.ReadExternalStorage) != (int)Permission.Granted)
{
ActivityCompat.RequestPermissions(this, new string[] { Manifest.Permission.ReadExternalStorage }, 1);
}
}
public override void OnRequestPermissionsResult(int requestCode, string[] permissions, [GeneratedEnum] Android.Content.PM.Permission[] grantResults)
{
Xamarin.Essentials.Platform.OnRequestPermissionsResult(requestCode, permissions, grantResults);
base.OnRequestPermissionsResult(requestCode, permissions, grantResults);
}
}
}