コメント
コメントの投稿
※名前とタイトルが入力されていないコメントでは他のコメントとの区別ができません。
入力されていないコメントには返信しませんのであらかじめご了承くださいませ。
<manifest android:sharedUserId="任意のアプリID"
<application android:requestLegacyExternalStorage="true" >
if (Build.VERSION.SdkInt >= BuildVersionCodes.R)※以下のURLでも変更されていないまま記載されていましたが、2021/05/29時点では値が30に更新されています。
{
//絶対に通りません。
}
private void SaveTextFile()
{
var intent = new Intent(Intent.ActionCreateDocument);
intent.AddCategory(Intent.CategoryOpenable);
intent.SetType("text/plain");
intent.PutExtra(Intent.ExtraTitle, "sample.txt");
StartActivityForResult(intent, 11111);
}
protected override void OnActivityResult(int requestCode, Result resultCode, global::Android.Content.Intent data)
{
base.OnActivityResult(requestCode, resultCode, data);
if (requestCode == 11111 &&
resultCode == Result.Ok &&
data != null &&
data.Data != null)
{
Android.Net.Uri uri = data.Data;
using (System.IO.Stream fos = this.ContentResolver.OpenOutputStream(uri))
{
fos.Write(System.Text.Encoding.UTF8.GetBytes("SAF Test"));
fos.Close();
}
}
}
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
android:installLocation="internalOnly"
package="com.Company.AppName">
<uses-sdk android:targetSdkVersion="30" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />
</manifest>
/// <summary>
/// Scoped Strage 対策
/// </summary>
private void RequestAllFilesAccessPermission()
{
try
{ //Scoped Strage 対策 Activity activity = Forms.MainActivity; string packageName = activity.PackageManager.GetPackageInfo(activity.PackageName, 0).PackageName; //TODO:BuildVersionCodes.Rに置き換える //if (Build.VERSION.SdkInt >= BuildVersionCodes.R) if ((int)Build.VERSION.SdkInt >= 30) {
if (Android.OS.Environment.IsExternalStorageManager)
{
return;
}
try { Intent intent = new Intent(Android.Provider.Settings.ActionManageAllFilesAccessPermission); intent.AddCategory("android.intent.category.DEFAULT"); intent.SetData(Android.Net.Uri.Parse("package:" + packageName)); activity.StartActivityForResult(intent, RequestCode.AllFilePermission); } catch (Exception) { Intent intent = new Intent(); intent.SetAction(Android.Provider.Settings.ActionManageAllFilesAccessPermission); activity.StartActivityForResult(intent, RequestCode.AllFilePermission);
} } else { //below android 11 activity.RequestPermissions(new String[] { Android.Manifest.Permission.WriteExternalStorage }, RequestCode.Permission); }
}
catch (Exception ex)
{
System.Console.WriteLine(ex.Message);
}
}
public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity
{
protected override void OnActivityResult(int requestCode, Result resultCode, global::Android.Content.Intent data)
{
base.OnActivityResult(requestCode, resultCode, data);
//ファイル管理パーミッションからの戻り
if (requestCode == RequestCode.AllFilePermission)
{
System.Console.WriteLine("StartActivityForResult ActionManageAllFilesAccessPermission:" + resultCode.ToString());
return;
}
}
}
※名前とタイトルが入力されていないコメントでは他のコメントとの区別ができません。
入力されていないコメントには返信しませんのであらかじめご了承くださいませ。