首页 > 获取点击文件后onActivityResult中文件路径错误

获取点击文件后onActivityResult中文件路径错误

if (data.getData() != null) {
            if (data.getData().getScheme().equals("content")) {
                String s = data.getData().getPath();  //文件路径
                Uri uri = data.getData();  // uri
                File file = new File(s);  //可打开的文件路径

                Z.log("path: "+s);
                Z.log("uri: "+uri);
                Z.log("file: "+file);


                Z.show("获取了返回值");
                Z.log(file.exists()+"");
                if (file.exists()) {  //判断文件是否存在
                    Log.e("file", "f是文件且存在");
                    Conversation conversation = getCurrentConversation();
                    sendFile(conversation.getConversationType(), conversation.getTargetId(), file, uri);
                } else {
                    Z.log("文件不存在");
                }
            }else {
                Z.show("如果文件类型不同");
            }
            
            没毛病吧?结果是打印的path是 /document/image:4935  ,为啥是这样啊,但奇怪的事来了:我使用下载的第三方re管理器打开选择文件,却可以正常打印/storage/emulated/0/Download/1452843394654564.jpg,,,,,什么情况?
            

使用这句了..虽然有点长

  /**
    • android 4.4以上和以下版本使用自带文件管理器打开本地文件路径不同,的解决方法
      *

    • @param context

    • @param uri

    • @return
      */

             @TargetApi(Build.VERSION_CODES.KITKAT)  //版本
    1. static String getPath(final Context context, final Uri uri) {

         
                 final boolean isKitKat = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT;
         
                 // DocumentProvider
                 if (isKitKat && DocumentsContract.isDocumentUri(context, uri)) {
                     // ExternalStorageProvider
                     if (isExternalStorageDocument(uri)) {
                         final String docId = DocumentsContract.getDocumentId(uri);
                         final String[] split = docId.split(":");
                         final String type = split[0];
         
                         if ("primary".equalsIgnoreCase(type)) {
                             return Environment.getExternalStorageDirectory() + "/" + split[1];
                         }
         
                         // TODO handle non-primary volumes
                     }
                     // DownloadsProvider
                     else if (isDownloadsDocument(uri)) {
         
                         final String id = DocumentsContract.getDocumentId(uri);
                         final Uri contentUri = ContentUris.withAppendedId(
                                 Uri.parse("content://downloads/public_downloads"), Long.valueOf(id));
         
                         return getDataColumn(context, contentUri, null, null);
                     }
                     // 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 getDataColumn(context, uri, null, null);
                 }
                 // File
                 else if ("file".equalsIgnoreCase(uri.getScheme())) {
                     return uri.getPath();
                 }
         
                 return null;
             }
         
             /**
      • Get the value of the data column for this Uri. This is useful for

      • MediaStore Uris, and other file-based ContentProviders.
        *

      • @param context The context.

      • @param uri The Uri to query.

      • @param selection (Optional) Filter used in the query.

      • @param selectionArgs (Optional) Selection arguments used in the query.

      • @return The value of the _data column, which is typically a file path.
        */

    2. 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);
                     }
                 } finally {
                     if (cursor != null)
                         cursor.close();
                 }
                 return null;
             }
         
             /**
      • @param uri The Uri to check.

      • @return Whether the Uri authority is ExternalStorageProvider.
        */

    3. static boolean isExternalStorageDocument(Uri uri) {

                 return "com.android.externalstorage.documents".equals(uri.getAuthority());
             }
         
             /**
      • @param uri The Uri to check.

      • @return Whether the Uri authority is DownloadsProvider.
        */

    4. static boolean isDownloadsDocument(Uri uri) {

                 return "com.android.providers.downloads.documents".equals(uri.getAuthority());
             }
         
             /**
      • @param uri The Uri to check.

      • @return Whether the Uri authority is MediaProvider.
        */

    5. static boolean isMediaDocument(Uri uri) {

                 return "com.android.providers.media.documents".equals(uri.getAuthority());
             }

    其实就一句话,不同手机拿到路径不同,需要将拿到的路径转换成绝对路径


    并不是错误,而是你拿到的还只是文件的scheme路径,是uri地址,还不是真正的file路径,需要把uri转换成file,比如你现在取的是图片文件,可以这么转换

    public String getRealPathFromURI(Uri uri) {
        String res = null;
        String[] proj = { MediaStore.Images.Media.DATA };
        Cursor cursor = getContentResolver().query(uri, proj, null, null, null);
        if(cursor.moveToFirst()){;
           int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
           res = cursor.getString(column_index);
        }
        cursor.close();
        return res;
    }
    【热门文章】
    【热门文章】