#android #xamarin #xamarin.forms
Вопрос:
Я создаю txt
файл в Xamarin.forms
. Первый раз, когда приложение одновременно выполняет запрос разрешения и создание исключения в Visual Studio.
System.UnauthorizedAccessException
Message=Access to the path "/storage/emulated/0/log.txt" is denied.
Со второго раза, когда я открываю приложение на мобильном устройстве, оно не будет запрашивать разрешение(как я предоставил непосредственно перед сбоем) и генерировать файл txt. Так что все работает нормально.
Почему он выдает ошибку при первом выполнении?
Это мой код
protected override void OnStart()
{
base.OnStart();
if ((int)Build.VERSION.SdkInt >= 23)
{
if (CheckSelfPermission(Manifest.Permission.AccessFineLocation) != Permission.Granted)
RequestPermissions(LocationPermissions, RequestId);
}
}
public override void OnRequestPermissionsResult(int requestCode, string[] permissions, [GeneratedEnum] Permission[] grantResults)
{
if (requestCode == RequestId)
{
if ((grantResults.Length == 1) amp;amp; (grantResults[0] == (int)Permission.Granted))
{
///Premission granted by user
string filePath = string.Empty;
filePath = Android.OS.Environment.ExternalStorageDirectory.ToString();
var filename = System.IO.Path.Combine(filePath, "log" ".txt");
}
else
{
///Permission denied by user
}
}
else
{
base.OnRequestPermissionsResult(requestCode, permissions, grantResults);
}
}
Комментарии:
1. Имя файла в вашем коде,
ProductStatusLog
, не совпадает с ошибкой msg:log.txt
2. @SushiHangover — В моем коде только обновленное имя. Все та же проблема. Спасибо.
Ответ №1:
Путь, который вы использовали, — это внешнее хранилище. Если вы хотите использовать этот путь в Xamarin.forms, вы можете использовать службу зависимостей.
Создайте интерфейс IExternalStorage:
public interface IExternalStorage
{
string GetPath();
}
Реализация на Android: Пожалуйста, обратите Android.OS.Environment.ExternalStorageDirectory
внимание, что она устарела.
[assembly:Dependency(typeof(AndroidImplementation))]
namespace App.Droid
{
public class AndroidImplementation: IExternalStorage
{
public string GetPath()
{
Context context = Android.App.Application.Context;
var filePath = context.GetExternalFilesDir("");
return filePath.Path;
}
}
}
Тогда вы могли бы использовать его в Xamarin.Формы:
var folderPath = DependencyService.Get<IExternalStorage>(). GetPath();
После получения пути вы можете использовать приведенный ниже код для создания файла и ввода некоторых строк.
var filePath = DependencyService.Get<IExternalStorage>().GetPath();
var path = System.IO.Path.Combine(filePath, "log" ".txt");
using (var writer = File.CreateText(path))
{
await writer.WriteLineAsync("hello");
}
//path: /storage/emulated/0/Android/data/com.companyname.app5/files/log.txt