2016-04-15 7 views
0

他のアプリから共有メニューでファイルを受け取ることができるアプリを書いています。私は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がUploadServiceFinish()に渡される、ということですいくつかの調査では、コンテンツプロバイダが受信アクティビティが生きている時間だけその特定のファイルに対する許可を発行することが分かった。そのアクティビティが閉じられると、パーミッションは破棄され、この例外がスローされます。実際、私がShareActivityFinish()を呼び出さないと、すべて正常に動作します(しかし、私はバックグラウンドで起こるためにアップロードが必要です)。

私のサービスにその許可を渡す方法はありますか?私はアップロードが、あらゆる活動から独立してバックグラウンドで起こることを望んでいませんでした。

私はこれらのStackOveflowの記事を読む: Using data from context providers or requesting Google Photos read permission?

java.lang.SecurityException: Permission Denial: opening provider com.google.android.apps.photos.content.GooglePhotosImageProvider

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にエンキューを取得し、一つずつアップロードされています。

+0

あなたのコードを投稿することができますか? – Giorgi

答えて

0

私は解決策を見つけた - 私はこのようなUploadServiceに発行された権限を渡すことができます。

var result = Intent.GetParcelableExtra (Intent.ExtraStream); 
UploadService.AddFile (Android.Net.Uri.Parse (result.ToString()), parentFolder); 
var i = new Intent (this, typeof(UploadService)); 
i.AddFlags (ActivityFlags.GrantReadUriPermission); //Pass permission from content provider 
i.SetData (Android.Net.Uri.Parse (result.ToString())); 
StartService (i); 

参考:http://developer.android.com/guide/topics/providers/content-provider-basics.html#Intents

関連する問題