当前位置: 首页 > 知识库问答 >
问题:

Android:files:当从文件浏览器中的“最近”部分选择文件时,无法从内容URI中获取文件路径

督阿苏
2023-03-14

我试图从data.data给出的Uri中获取文件路径!!Android中的onActivityResult()方法。当我在File browser中选择DCIM文件夹时,我能够获得文件路径,但当我在File browser中从最近的部分中选择相同的文件时,我没有获得文件路径。

单击按钮时的代码:

                                        val intent = Intent();
                                        intent.setType("image/*");
                                        val mimeTypes: Array<String> = arrayOf("image/*", "application/pdf")
                                        intent.putExtra(Intent.EXTRA_MIME_TYPES,mimeTypes)
                                        intent.setAction(Intent.ACTION_OPEN_DOCUMENT);
                                        intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
                                        startActivityForResult(Intent.createChooser(intent, "Select File"), 101);
var selectedImagePathFB:String = ""
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    super.onActivityResult(requestCode, resultCode, data)
    if (resultCode == RESULT_OK) {
        if (requestCode == 101) {
            val selectedImageUri:Uri = data?.data!!
            selectedImagePathFB = getPath(this@MyContactUsActivity,selectedImageUri);
            //selectedImagePathFB = AppUtils().getRealPathFromURI(this@MyContactUsActivity,selectedImageUri)
            val url: String = selectedImagePathFB

        }
    }
}

和getPath(Context,Uri)是PaulBurke从stackoverflow中找到的常见代码:

 public static String getPath(final Context context, final Uri uri) {


    // DocumentProvider
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT && DocumentsContract.isDocumentUri(context, uri)) {

        if (isExternalStorageDocument(uri)) {
            final String docId = DocumentsContract.getDocumentId(uri);
            final String[] split = docId.split(":");
            final String type = split[0];

            return Environment.getExternalStorageDirectory() + "/" + split[1];

            // TODO handle non-primary volumes
        }
        // DownloadsProvider
        else if (isDownloadsDocument(uri)) {
            try {
                final String id = DocumentsContract.getDocumentId(uri);
                //Log.d(TAG, "getPath: id= " + id);
                final Uri contentUri = ContentUris.withAppendedId(Uri.parse("content://downloads/public_downloads"), Long.valueOf(id));
                return getDataColumn(context, contentUri, null, null);
            }catch (Exception e){
                e.printStackTrace();
                List<String> segments = uri.getPathSegments();
                if(segments.size() > 1) {
                    String rawPath = segments.get(1);
                    if(!rawPath.startsWith("/")){
                        return rawPath.substring(rawPath.indexOf("/"));
                    }else {
                        return rawPath;
                    }
                }
            }
        }
        // MediaProvider
        else if (isMediaDocument(uri)) {
            final String docId = DocumentsContract.getDocumentId(uri);
            final String[] split = docId.split(":");
            final String type = split[0];

            Uri contentUri = null;
            if ("image".equals(type)) {
                contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
            } else if ("video".equals(type)) {
                contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
            } else if ("audio".equals(type)) {
                contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
            }

            final String selection = "_id=?";
            final String[] selectionArgs = new String[]{
                    split[1]
            };

            return getDataColumn(context, contentUri, selection, selectionArgs);
        }
    }
    // MediaStore (and general)
    else if ("content".equalsIgnoreCase(uri.getScheme())) {

        // Return the remote address
        if (isGooglePhotosUri(uri))
            return uri.getLastPathSegment();

        return getDataColumn(context, uri, null, null);
    }
    // File
    else if ("file".equalsIgnoreCase(uri.getScheme())) {
        return uri.getPath();
    }

    return null;
}
public static String getDataColumn(Context context, Uri uri, String selection,
                                   String[] selectionArgs) {

    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);
        }
    }catch (Exception e){
        e.printStackTrace();
    }finally {
        if (cursor != null)
            cursor.close();
    }
    return "nodata";
}

public static boolean isExternalStorageDocument(Uri uri) {
    return "com.android.externalstorage.documents".equals(uri.getAuthority());
}

public static boolean isDownloadsDocument(Uri uri) {
    return "com.android.providers.downloads.documents".equals(uri.getAuthority());
}

public static boolean isMediaDocument(Uri uri) {
    return "com.android.providers.media.documents".equals(uri.getAuthority());
}

public static boolean isGooglePhotosUri(Uri uri) {
    return "com.google.android.apps.photos.content".equals(uri.getAuthority());
}

我正在AndroidQ设备上测试。为什么在文件浏览器中从最近的部分选择文件时,我没有得到任何文件路径,而在存储部分中选择相同的文件则返回文件路径?如果不是从文件路径转换像PDF文件或Base64字符串中的图像,是否有一个解决方案?

共有1个答案

燕英奕
2023-03-14

根据您的代码,没有错误。但是在从最近的部分获取文件之前必须获得存储权限。需要读和写权限。

 类似资料:
  • 我正在尝试获取内容URI的文件路径。URL如下所示:content://com.android.providers.downloads.documents/document/31 游标对象不是null,但cursor.getString(column_index)返回null。 列索引始终为0。 编辑:内容URI是从文件管理器返回的,因此它应该表示实际的文件。

  • 我正在开发一个Android应用程序,其中一个功能是让用户选择要打开的文件(我想打开一个纯文本的.txt文件)。我以前用Java开发过Android应用程序,但这次我使用的是Kotlin,而且这是我第一次使用Kotlin。 我现在让应用程序显示一个文件选择器,让用户点击他们想要打开的文件。然后我尝试使用File对象打开文件并执行forEachLine循环。但是由于某种原因,它抛出了一个java.i

  • 问题内容: 当我在浏览器中使用以下URL时,它将提示我下载带有JSOn内容的文本文件。 https://chart.googleapis.com/chart?cht=p3&chs=250x100&chd=t:60,40&chl=Hello|World&chof=json (单击上面的URL查看下载的文件内容) 现在,我想创建一个php页面。我希望当我调用此php页面时,它应调用上述URL并从文件中

  • 我想从接收正常文件路径,如下所示: 这个文件也存在,但我不能得到它。我在这里看到了一些建议获得路径的问题,如下所示: 但此方法返回以下异常: 因此,我在这里收到的: 如何将文件转换为字符串:

  • 问题内容: 我正在尝试创建一个简单的Java程序,该程序从zip文件中的文件读取和提取内容。压缩文件包含3个文件(txt,pdf,docx)。我需要阅读所有这些文件的内容,并且为此使用了Apache Tika。 有人可以帮我实现此功能。到目前为止,我已经尝试过了,但是没有成功 代码段 问题答案: 如果你想知道如何从每个文件中获取文件内容,ZipEntry那实际上很简单。这是一个示例代码: 一旦拥有

  • 我正在尝试使用隐式意图操作_SEND将其他应用程序中的图像共享到我的应用程序中。 当从chrome浏览器共享搜索图像时,应用程序接收到一个内容URI,如下所示: 如何从这种类型的内容URI获取文件路径?所有其他应用,比如Facebook、谷歌都在这么做。我使用FileChooser获取其他类型内容URI的文件路径(例如,从Gallery)。 试着到处寻找,但没有太多帮助。有人能建议如何使用这些内容