Android中URI的文件名与实际文件名不同

3

我需要获取要上传的文件的名称和扩展名。我让用户使用Intent调用选择文件,并通过以下方式获取URI:

public void onActivityResult(int requestCode, int resultCode, Intent data) {
/* stuff */
Uri uri = data.getData();
String filePath = data.getData().getPath();
Log.d("filePath ",filePath);
Log.d("URI ", uri.toString());
String fileName = (new File(filePath)).getName();
Log.d("fileName ",fileName);

但结果是这样的:

com.blah.blah D/URI: content://com.android.providers.downloads.documents/document/354
com.blah.blah D/filePath: /document/354
com.blah.blah D/fileName: 354

文件名甚至不是354!它是一个PDF文件(例如“Bus e-Ticket.pdf”或“Xender.apk”)

String fileName = (new File(filePath)).getAbsolutePath();也会得到相同的结果。我怎样才能获取磁盘上的文件名/扩展名?


1
然后使用ContentResolver API - pskink
2个回答

2

但结果如下

getPath()content 格式的Uri 上是无意义的。在任何不是file格式的Uri 上使用getPath() 都是无意义的。

文件名甚至不是354

并没有要求必须有一个文件,https://dev59.com/1Qv5s4cB2Jgan1znkFAa 是一个Uri,我非常自信地认为在Stack Overflow服务器上的路径/questions/46060367/android-filename-from-uri-is-not-the-same-as-actual-filename上没有文件。

如何获取磁盘上的文件名/扩展名?

并没有要求用户选择的一定是一个文件。您可以使用DocumentFile.fromSingleUri()getName()来获取由Uri标识的内容的“显示名称”。这不一定是带有扩展名的文件名。


0

您可以使用MediaStore类来获取用户看到的文件名。具体来说,请使用如下所示的MediaColumns接口

String[] projection = {MediaStore.MediaColumns.DISPLAY_NAME};
        ContentResolver cr = mctx.getContentResolver();
        Cursor metaCursor = cr.query(uri[0], projection, null, null, null);
        if (metaCursor != null) {
            try {
                if (metaCursor.moveToFirst()) {
                    realFileName = metaCursor.getString(0);
                }
            } finally {
                metaCursor.close();
            }
        }

请注意,并非每个Uri都支持MediaColumns - CommonsWare

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接