所以我正在编写一个应用程序,可以通过共享菜单从其他应用程序接收文件。我有一个ShareActivity
,它有用于接收文件的意图过滤器。
一旦收到文件,就会启动共享活动,用户必须在该活动中选择一个文件夹,将收到的文件上传到其中。当用户选择了文件夹后,一个服务就会启动,从而上传文件。
问题是,接收到的文件URI(来自谷歌照片)被传递到上传服务
,而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帖子:使用上下文提供商的数据还是请求谷歌照片读取权限?
JAVAlang.SecurityException:权限拒绝:打开提供程序com.google.Android应用程序。照片。所容纳之物谷歌图片提供商
权限拒绝:打开提供程序
一个回答让我目瞪口呆(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
中排队并一个接一个地上传。
我找到了解决方案——我可以将颁发的权限传递给上传服务
,如下所示:
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
我有两个app:app1和app2。 App2具有: paths.xml: App2在其活动中从App1接收获取映像URI的请求。确定URI后,App2活动执行以下操作: 从App2接收回结果后,App1执行以下操作: 在App1中,从App2返回时,我得到以下异常: java.lang.SecurityException:权限拒绝:从ProcessRecord{52a99eb0 3493:com
我的应用程序的目标SdkVersion=29 我拍了一张照片,它保存在路径: src=/storage/simulated/0/DCIM/Camera/IMG_20201120_091943。jpg 然后我想使用FileInputStream/FileOutputStream将此图像复制到内部存储。虽然,我的应用程序有WRITE/READ存储权限,但当我编码 我收到了一个FileNotFoundE
我添加了使用权限,包括WRITE_EXTERNAL_STORAGE,android.permission.相机,READ_EXTERNAL_STORAGEAndroidManifest.xml. 当我在Nexus6(API 24)中运行我的应用程序时,它向我抛出了以下错误: java.io.IOException:权限被拒绝 这是我的代码: 如何在权限相机运行时打开之前使用它?
我试图在android中写入文件,但一直出现以下错误: java.io.FileNotFoundException: /storage/emulated/0/Notes/TestFile.txt(权限拒绝) 搜索此网站可以简单地解决此问题,即向应用程序清单文件添加WRITE\u EXTERNAL\u存储,但这对我不起作用。我一直在犯同样的错误。
在android studio中运行应用程序时,我遇到了权限被拒绝的问题。在此之前,我需要声明,我的队友可以运行代码并弹出数据,但我,我们都使用相同的代码和版本,但我使用的是mac,他们使用的是win系统。 以下是logcat信息: 下面是AndroidMainfest文件:For tools sLtaretApi="31"我尝试删除并运行没有任何更改 有人能给我一些解决这个问题的建议吗?感谢任何