在KitKat之前(或在新Gallery之前)Intent.ACTION_GET_CONTENT返回这样的URI
内容://媒体/外部/图像/媒体/ 3951.
使用ContentResolver和quering
MediaStore.Images.Media.DATA返回文件URL.
但是在KitKat中,Gallery会返回一个URI(通过"Last"),如下所示:
内容://com.android.providers.media.documents/document/image:3951
我该如何处理?
android android-intent android-contentresolver android-gallery
我尝试了一个解决方案(见下文)工作正常,除了在Android 4.4中调用startActivityForResult()一个名为"Open from"的活动,其中包含"Recent","Images","Downloads"以及几个可供选择的应用程序.当我选择"图像"并尝试解析返回的内容URI(使用下面的代码)时,调用cursor.getString()返回null.如果我使用Gallery应用程序选择完全相同的文件,则cursor.getString()返回文件路径.我只在API级别16和19中对此进行了测试.一切都按照16中的预期运行.至于19,我必须选择Gallery或其他应用程序,否则它不起作用.
private String getRealPathFromURI(Context context, Uri contentUri) {
Cursor cursor = null;
try {
String[] proj = { MediaStore.Images.Media.DATA };
cursor = context.getContentResolver().query(contentUri, proj, null, null, null);
int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
cursor.moveToFirst();
String path = cursor.getString(column_index);
return path;
} finally {
if (cursor != null) {
cursor.close();
}
}
}
Run Code Online (Sandbox Code Playgroud) 我正在使用Android下载管理器下载文件列表.最近我遇到了一份崩溃报告说
Unknown java.lang.IllegalArgumentException: Unknown URL content://downloads/my_downloads
然后,我想通了,原因是因为用户禁用了Android下载管理器.我通过使用以下代码检查下载管理器的包名来检查是否已禁用下载管理器.
int state = this.getPackageManager().getApplicationEnabledSetting("com.android.providers.downloads");
Run Code Online (Sandbox Code Playgroud)
现在,我需要找到一种方法来启用下载管理器,如果它被禁用.我尝试使用Manifest中的权限设置它的启用状态但我一直得到安全异常.
this.getPackageManager().setApplicationEnabledSetting("com.android.providers.downloads", PackageManager.COMPONENT_ENABLED_STATE_DEFAULT, 0);
<uses-permission android:name="android.permission.CHANGE_COMPONENT_ENABLED_STATE"/>
Run Code Online (Sandbox Code Playgroud)
所以我认为它可能无法访问,因为它是一个系统应用程序.(谷歌Play应用程序).
有没有办法将用户重定向到下载管理器应用程序信息视图?让用户启用它?如果无法以编程方式在运行时启用它.
android android-package-managers android-download-manager android-settings
我在这里附上日志:
Caused by: java.lang.IllegalArgumentException: Unknown URI: content://downloads/public_downloads/1587
at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:165)
at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:135)
at android.content.ContentProviderProxy.query(ContentProviderNative.java:418)
Run Code Online (Sandbox Code Playgroud)
我正在使用此代码,效果很好。但是对于下载管理器,它在``try''块的第一行引发异常
Cursor cursor = null;
final String column = "_data";
final String[] projection = {
column
};
try {
cursor = context.getContentResolver().query(uri, projection, selection, selectionArgs,
null);
if (cursor != null && cursor.moveToFirst()) {
final int column_index = cursor.getColumnIndexOrThrow(column);
return cursor.getString(column_index);
}
} finally {
if (cursor != null)
cursor.close();
}
return null;
Run Code Online (Sandbox Code Playgroud)
我已经尝试过:Android使用contentResolver从内容URI获取文件路径, 并且:java.lang.IllegalArgumentException:未知的URI内容以及与此问题相关的其他一些内容,但没有一个解决了我的问题。
android uri android-contentprovider android-download-manager android-8.0-oreo
我想通过以下代码清除下载历史记录:
getContentResolver().delete(Uri.parse("content://downloads/my_downloads"), null, null);
但总是失败,因为尽管我声明了权限拒绝!
E/AndroidRuntime(3278): java.lang.SecurityException: 权限拒绝: 编写 com.android.providers.downloads.DownloadProvider uri content://downloads/my_downloads from pid=3278, uid=10081 需要 android.permission.ACCESS_DOWNLOAD_MANAGER
有人有什么建议吗?提前致谢!
我可以使用下载管理器从服务器下载视频。但是,当我使用以下代码记录路径时。
String path = Environment.getExternalStoragePublicDirectory(directory).getAbsolutePath() + subpath;
Log.e("PATH", path);
Run Code Online (Sandbox Code Playgroud)
我得到
12-15 13:29:36.787 22807-22807/com.ezyagric.extension.android E/PATH:/storage/sdcard0/EZYAGRIC/Soil Testing.mp4。
现在这与手机上的路径不同
/storage/sdcard0/Android/data/com.ezyagric.extension.android/files/EZYAGRIC/Crop Insurance.mp4
是什么带来了这种差异,如何才能获得手机中的路径?