编辑:这不是重复的问题。毫无疑问,当您无法控制发送意图的活动时(如果是我的情况,浏览器应用程序或文件浏览应用程序会将意图发送给我的应用程序),我将为您解决该问题。然后,更具体地说,这与照片/画廊无关。
这一直困扰着我的一个应用程序。我个人无法在任何设备上实现它,但是从崩溃中我可以看到它在其他设备上经常发生。
我的应用程序从外部应用程序收到包含ZIP文件的意图。我在onCreate()
或onNewIntent()
中捕获了它:
Intent intent = getIntent();
if (intent != null && intent.getData() != null)
beginZipIntent(intent);
在beginZipIntent()
中:
Uri data = intent.getData();
String filename = data.toString();
// Open input stream to copy ZIP to a temporary directory.
Uri uri = Uri.parse(filename);
InputStream inputStream = null;
try
{
inputStream = getContentResolver().openInputStream(uri); // This fails
}
catch (Exception e)
{
//...
}
在上面的行中,某些设备发生故障:
Permission Denial: reading com.android.providers.downloads.DownloadStorageProvider uri content://com.android.providers.downloads.documents/document/2772 from pid=26094, uid=10094 requires android.permission.MANAGE_DOCUMENTS, or grantUriPermission()
我无法控制发送意图的应用程序/活动。我以为可以通过立即抓取文件并将其保存到临时目录中来解决此问题(如其他答案所示),但是不行。
我还添加了android.permission.MANAGE_DOCUMENTS
,但按预期(从其他答案中得出),它不起作用。
有人遇到吗?似乎会影响从Android 4到7的设备,因此并非特定于一个OS版本。
答案 0 :(得分:4)
好吧,我之前遇到过这个问题,当时我有一个运行在android 7.1上的oppo设备,而且工作正常,但在同一个版本的android上出现了问题,因此要解决此问题,我要求读取存储权限(如果需要),它就可以了。
喜欢代码的人的例子:
public class CheckPermissions {
public static boolean hasPermission(int PERMISSION_REQUEST, String permission, Context context) {
if (ContextCompat.checkSelfPermission(context,
permission)
!= PackageManager.PERMISSION_GRANTED) {
// Should we show an explanation?
if (ActivityCompat.shouldShowRequestPermissionRationale((Activity) context,
permission) &&
ContextCompat.checkSelfPermission(context,
permission)
!= PackageManager.PERMISSION_GRANTED) {
return false;
} else {
ActivityCompat.requestPermissions((Activity) context,
new String[]{permission},
PERMISSION_REQUEST);
}
return false;
} else {
return true;
}
}
}
并检查权限:
if (CheckPermissions.hasPermission(REQUEST_CODE,
Manifest.permission.READ_EXTERNAL_STORAGE, this))
// todo read the saved URI
我还希望您向清单添加权限:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
并使用写入权限也可以写入文件。
答案 1 :(得分:2)
您可能需要在代码和清单中添加以下运行时权限
<uses-permission android:name="android.permission.WRITE_INTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
您可以引用此链接#save_zip_files
希望对您有帮助!
答案 2 :(得分:1)
只需在获取URI之前添加此行
StrictMode.VmPolicy.Builder builder = new StrictMode.VmPolicy.Builder();
StrictMode.setVmPolicy(builder.build());