【发布时间】:2016-04-15 13:40:22
【问题描述】:
所以我正在编写一个应用程序,它可以通过共享菜单从其他应用程序接收文件。我有一个ShareActivity,它有接收文件的意图过滤器。
一旦收到文件ShareActivity 就会启动,并且在该活动中,用户必须选择一个文件夹来上传收到的文件。当用户选择了文件夹后,就会启动一个服务来上传文件。
问题在于,接收到的文件 URI(来自 Google Photos)被传递给 UploadService 并且为 ShareActivity 调用 Finish() 并且当 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 上调用Finish(),一切正常(但我需要在后台进行上传)。
有没有办法将该权限传递给我的服务?我不希望独立于任何活动在后台进行上传。
我阅读了这些 StackOveflow 帖子: Using data from context providers or requesting Google Photos read permission?
Permission denial: opening provider
一个答案让我眼前一亮 (https://stackoverflow.com/a/30909105/5884133),它说
使用临时文件路径
关于如何解决这个问题的任何想法?如何获取临时文件路径?
编辑:
当用户选择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 并被一一上传。
【问题讨论】:
-
你能发布你的代码吗?
标签: android file xamarin permissions