首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从SAF内容URI中提取文件名

从SAF内容URI中提取文件名
EN

Stack Overflow用户
提问于 2014-09-23 15:15:53
回答 1查看 793关注 0票数 4

你好,我的同事堆满了,

我正在编写一个应用程序,在该应用程序中我实现了一个处理共享意图的活动。到目前为止,它运行良好,但在测试期间,我遇到了Quickoffice (Android4.4,KitKat)的问题,因为它返回了一个URI,无法从中获取文件名。我还试着和其他应用分享,比如Dropbox,它在那里工作。

我从Qickoffice应用程序获得的确切URI:

代码语言:javascript
复制
content://com.quickoffice.android.quickcommon.FileContentProvider/5cmeDeeatcdv8IFyu-bEr2w1jSHrvPmCzXGb_VvZulMBErE5Tmfd_5P5kckE68LaEYDVSp3q5r19%0A4sOkpYCEM_VqK6Y%3D%0A

这是我第一次使用的代码:

代码语言:javascript
复制
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;
}

在这里我收到了以下错误:

代码语言:javascript
复制
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)

经过一些研究后,我发现Android4.4Kitkat引入了SAF (,存储访问框架),它管理不同的数据,因此我尝试了来自https://developer.android.com/guide/topics/providers/document-provider.html的以下代码来获得名称:

代码语言:javascript
复制
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;
}

但是我也收到了一个错误代码:

代码语言:javascript
复制
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中获得名称,我将非常感谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-09-23 16:59:04

在搜索了更多之后,我找到了如何从Quickoffice获得的URI中获取文件名的问题的答案。

代码语言:javascript
复制
public String getNameFromURI(Uri contenturi){

    String[] proj = {
            OpenableColumns.DISPLAY_NAME,
            OpenableColumns.SIZE
    };
    String name = null;
    int size= 0;
    Cursor metadataCursor = getContentResolver().query(contenturi,  proj, null, null, null);

    if (metadataCursor != null) {
        try {
            if (metadataCursor.moveToFirst()) {
                name = metadataCursor.getString(0);
                size = metadataCursor.getInt(1);
            }
        } finally {
            metadataCursor.close();
        }
    }

    return name;
}

问题是我没有使用合适的类型,我想要得到。使用后:

代码语言:javascript
复制
String[] proj = {
        OpenableColumns.DISPLAY_NAME,
        OpenableColumns.SIZE
};

一切都很好。抱歉你浪费时间了。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25998735

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档