大家好,我正在编写一个应用程序,其中实现了处理共享意图的活动。 到目前为止,它运行良好,但在测试期间,我遇到了Quickoffice(Android 4.4,KitKat)的问题, 因为它返回一个我无法从中获取文件名的URI。 我还尝试了与其他应用程序(如Dropbox)共享,它在那里工作。
我从Quickoffice应用程序获得的确切URI:
content://com.quickoffice.android.quickcommon.FileContentProvider/5cmeDeeatcdv8IFyu-bEr2w1jSHrvPmCzXGb_VvZulMBErE5Tmfd_5P5kckE68LaEYDVSp3q5r19%0A4sOkpYCEM_VqK6Y%3D%0A
这是我最初使用的代码:
public String getRealPathFromURI(Uri contentUri) {
Cursor cursor = null;
try {
String[] proj = {MediaStore.Images.Media.DATA}; // = "_data"
ContentResolver cr = getContentResolver();
cursor = cr.query(contentUri, proj, null, null, null); // <--EXCEPTION
int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
cursor.moveToFirst();
return cursor.getString(column_index);
} catch (Exception exception) {
Log.d("clixend", "Exception: " + exception);
Toast.makeText(this, "Exception: " + exception, Toast.LENGTH_LONG).show();
} finally {
if (cursor != null) {
cursor.close();
}
}
return null;
}
我遇到了以下错误:
09-23 16:54:17.664 32331-32341/? E/DatabaseUtils﹕ Writing exception to parcel
java.lang.UnsupportedOperationException: Unsupported column: _data
at com.google.android.apps.docs.quickoffice.FileContentProvider.query(FileContentProvider.java:78)
at android.content.ContentProvider.query(ContentProvider.java:857)
at android.content.ContentProvider$Transport.query(ContentProvider.java:200)
at android.content.ContentProviderNative.onTransact(ContentProviderNative.java:112)
at android.os.Binder.execTransact(Binder.java:404)
at dalvik.system.NativeStart.run(Native Method)
经过一些研究,我发现Android 4.4 Kitkat引入了SAF(Storage Access Framework),它以不同的方式管理数据,因此我尝试使用https://developer.android.com/guide/topics/providers/document-provider.html中的以下代码获取名称:
public String getNameKitkat(Uri contentUri) {
Cursor cursor = getContentResolver()
.query(contentUri, null, null, null, null, null); // <--EXCEPTION
try {
if (cursor != null && cursor.moveToFirst()) {
String displayName = cursor.getString(
cursor.getColumnIndex(OpenableColumns.DISPLAY_NAME));
return displayName;
}
} finally {
cursor.close();
}
return null;
}
但我也收到了一个错误代码:
09-23 16:49:43.317 32331-32421/? E/DatabaseUtils﹕ Writing exception to parcel
java.lang.IllegalArgumentException: columnNames.length = 4, columnValues.size() = 2
at android.database.MatrixCursor.addRow(MatrixCursor.java:157)
at android.database.MatrixCursor.addRow(MatrixCursor.java:128)
at com.google.android.apps.docs.quickoffice.FileContentProvider.query(FileContentProvider.java:95)
at android.content.ContentProvider.query(ContentProvider.java:857)
at android.content.ContentProvider$Transport.query(ContentProvider.java:200)
at android.content.ContentProviderNative.onTransact(ContentProviderNative.java:112)
at android.os.Binder.execTransact(Binder.java:404)
at dalvik.system.NativeStart.run(Native Method)
如果有人知道如何从Quickoffice获取的URI中提取名称,我将非常感激。