他のアプリから共有メニューでファイルを受け取ることができるアプリを書いています。私はShareActivity
を持っていますが、それはファイルを受け取るためのインテントフィルターを持っています。Androidの「アクセス拒否」、共有ファイルを受け取ったとき
ファイルが受信されると、ShareActivity
が開始され、そのアクティビティでは、受信したファイルをアップロードするフォルダを選択する必要があります。ユーザがフォルダを選択すると、ファイルがアップロードされるサービスが開始されます。
[Xamarin.Insights] Warning: Unhandled exception: Java.Lang.SecurityException: Permission Denial: opening provider com.google.android.apps.photos.contentprovider.MediaContentProvider from ProcessRecord{cf1e0da 8268:lv.new_failiem/u0a247} (pid=8268, uid=10247) that is not exported from uid 10124
[Xamarin.Insights] at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() [0x0000c] in /Users/builder/data/lanes/3053/a94a03b5/source/mono/external/referencesource/mscorlib/system/runtime/exceptionservices/exceptionservicescommon.cs:143
[Xamarin.Insights] at Android.Runtime.JNIEnv.CallObjectMethod (IntPtr jobject, IntPtr jmethod, Android.Runtime.JValue* parms) [0x00064] in /Users/builder/data/lanes/3053/a94a03b5/source/monodroid/src/Mono.Android/src/Runtime/JNIEnv.g.cs:195
[Xamarin.Insights] at Android.Content.ContentResolver.OpenInputStream (Android.Net.Uri uri) [0x00044] in /Users/builder/data/lanes/3053/a94a03b5/source/monodroid/src/Mono.Android/platforms/android-23/src/generated/Android.Content.ContentResolver.cs:926
[Xamarin.Insights] at lv.failiem.android.UploadService+<UploadFiles>c__async0.MoveNext() [0x0031a] in /Projects/Android/UploadService.cs:116
これにより:
問題がShareActivity
のために呼び出され、ShareActivity
が終了すると、例外がスローされます(Googleフォト)から受信したファイルのURIがUploadService
とFinish()
に渡される、ということですいくつかの調査では、コンテンツプロバイダが受信アクティビティが生きている時間だけその特定のファイルに対する許可を発行することが分かった。そのアクティビティが閉じられると、パーミッションは破棄され、この例外がスローされます。実際、私がShareActivity
にFinish()
を呼び出さないと、すべて正常に動作します(しかし、私はバックグラウンドで起こるためにアップロードが必要です)。
私のサービスにその許可を渡す方法はありますか?私はアップロードが、あらゆる活動から独立してバックグラウンドで起こることを望んでいませんでした。
私はこれらのStackOveflowの記事を読む: Using data from context providers or requesting Google Photos read permission?
Permission denial: opening provider
一つの答えは、一時ファイルのパス
を使用に述べていた、(https://stackoverflow.com/a/30909105/5884133)私の目をcought
これを解決する方法はありますか?一時的なファイルパスを取得するには?
編集:ユーザーがShareActivity
でフォルダを選択した場合 、このメソッドが呼び出されます:
void AddUploadFiles(Folder folder) {
switch (Intent.Action) {
//For receiving one file
case Intent.ActionSend:
var result = Intent.GetParcelableExtra (Intent.ExtraStream);
var uri = Android.Net.Uri.Parse (result.ToString());
UploadService.AddFile (Android.Net.Uri.Parse (result.ToString()), folder);
StartService (new Intent(this, typeof(UploadService)));
break;
//For receiving multiple files
case Intent.ActionSendMultiple:
var imageUris = Intent.GetParcelableArrayListExtra (Intent.ExtraStream);
foreach (var item in imageUris)
UploadService.AddFile (Android.Net.Uri.Parse (item.ToString()), folder);
StartService (new Intent(this, typeof(UploadService)));
break;
}
}
するとファイルがUploadService
にエンキューを取得し、一つずつアップロードされています。
あなたのコードを投稿することができますか? – Giorgi