【问题标题】:How to get the path of a video which is selected from gallery on android 10如何获取从 android 10 上的图库中选择的视频的路径
【发布时间】:2020-11-14 23:35:18
【问题描述】:

我尝试了很多 sn-ps。这就是我现在正在使用的。我知道 MediaStore.Video.Media.DATA 已被弃用。不知何故,这种方法也适用于 android 10,但有时它会抛出

android.database.CursorIndexOutOfBoundsException: 请求索引 0,大小为 0

public static String getvideoPath(Context context, Uri uri) {
    try {
        Cursor cursor = context.getContentResolver().query(uri, null, null, null, null);
        cursor.moveToFirst();
        String document_id = cursor.getString(0);
        LogMessage.v("Document Id:: "+document_id);
        if(document_id!=null){
        document_id = document_id.substring(document_id.lastIndexOf(":") + 1);
        cursor.close();
        cursor = context.getContentResolver().query(
                MediaStore.Video.Media.EXTERNAL_CONTENT_URI,
                null, MediaStore.Video.Media._ID + " = ? ", new String[]{document_id}, null);
        cursor.moveToFirst();
        String path = cursor.getString(cursor.getColumnIndex(MediaStore.Video.Media.DATA));
        cursor.close();
        return path;
        }else
            return getPath(context,uri);
    } catch (Exception e) {
        e.printStackTrace();
        return getPath(context,uri);
    }
}

private static String getPath(Context context,Uri uri){
    try {
        String[] proj = { MediaStore.Video.Media.DATA };
        Cursor cursor = context.getContentResolver().query(uri, proj, null, null, null);
        cursor.moveToFirst();
        String document_id = cursor.getString(0);
        return document_id;
    } catch (Exception e) {
        e.printStackTrace();
    }
    return null;
}

【问题讨论】:

    标签: java android path android-contentresolver


    【解决方案1】:

    使用以下方法从图库中获取视频的真实路径

    @SuppressLint("NewApi")
        public  String getPath( final Uri uri) {
            // check here to KITKAT or new version
            final boolean isKitKat = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT;
            String selection = null;
            String[] selectionArgs = null;
            // DocumentProvider
            if (isKitKat ) {
                // ExternalStorageProvider
    
           if (isExternalStorageDocument(uri)) {
                final String docId = DocumentsContract.getDocumentId(uri);
                final String[] split = docId.split(":");
                final String type = split[0];
    
                String fullPath = getPathFromExtSD(split);
                if (fullPath != "") {
                    return fullPath;
                } else {
                    return null;
                }
            }
    
    
            // DownloadsProvider
    
            if (isDownloadsDocument(uri)) {
    
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                    final String id;
                    Cursor cursor = null;
                    try {
                        cursor = context.getContentResolver().query(uri, new String[]{MediaStore.MediaColumns.DISPLAY_NAME}, null, null, null);
                        if (cursor != null && cursor.moveToFirst()) {
                            String fileName = cursor.getString(0);
                            String path = Environment.getExternalStorageDirectory().toString() + "/Download/" + fileName;
                            if (!TextUtils.isEmpty(path)) {
                                return path;
                            }
                        }
                    }
                    finally {
                        if (cursor != null)
                            cursor.close();
                    }
                    id = DocumentsContract.getDocumentId(uri);
                    if (!TextUtils.isEmpty(id)) {
                        if (id.startsWith("raw:")) {
                            return id.replaceFirst("raw:", "");
                        }
                        String[] contentUriPrefixesToTry = new String[]{
                                "content://downloads/public_downloads",
                                "content://downloads/my_downloads"
                        };
                        for (String contentUriPrefix : contentUriPrefixesToTry) {
                            try {
                                final Uri contentUri = ContentUris.withAppendedId(Uri.parse(contentUriPrefix), Long.valueOf(id));
    
    
                                return getDataColumn(context, contentUri, null, null);
                            } catch (NumberFormatException e) {
                                //In Android 8 and Android P the id is not a number
                                return uri.getPath().replaceFirst("^/document/raw:", "").replaceFirst("^raw:", "");
                            }
                        }
    
    
                    }
                }
                else {
                    final String id = DocumentsContract.getDocumentId(uri);
    
                    if (id.startsWith("raw:")) {
                        return id.replaceFirst("raw:", "");
                    }
                    try {
                        contentUri = ContentUris.withAppendedId(
                                Uri.parse("content://downloads/public_downloads"), Long.valueOf(id));
                    }
                    catch (NumberFormatException e) {
                        e.printStackTrace();
                    }
                    if (contentUri != null) {
    
                        return getDataColumn(context, contentUri, null, null);
                    }
                }
            }
    
    
            // MediaProvider
           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;
                }
                selection = "_id=?";
                selectionArgs = new String[]{split[1]};
    
    
                return getDataColumn(context, contentUri, selection,
                        selectionArgs);
            }
    
           if (isGoogleDriveUri(uri)) {
                return getDriveFilePath(uri);
            }
    
           if(isWhatsAppFile(uri)){
                return getFilePathForWhatsApp(uri);
            }
    
    
           if ("content".equalsIgnoreCase(uri.getScheme())) {
    
                if (isGooglePhotosUri(uri)) {
                    return uri.getLastPathSegment();
                }
                if (isGoogleDriveUri(uri)) {
                    return getDriveFilePath(uri);
                }
                if( Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q)
                {
    
                    // return getFilePathFromURI(context,uri);
                    return copyFileToInternalStorage(uri,"userfiles");
                    // return getRealPathFromURI(context,uri);
                }
                else
                {
                    return getDataColumn(context, uri, null, null);
                }
    
           }
           if ("file".equalsIgnoreCase(uri.getScheme())) {
                return uri.getPath();
            }
        }
        else {
    
            if(isWhatsAppFile(uri)){
                return getFilePathForWhatsApp(uri);
            }
    
            if ("content".equalsIgnoreCase(uri.getScheme())) {
                String[] projection = {
                        MediaStore.Images.Media.DATA
                };
                Cursor cursor = null;
                try {
                    cursor = context.getContentResolver()
                            .query(uri, projection, selection, selectionArgs, null);
                    int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
                    if (cursor.moveToFirst()) {
                        return cursor.getString(column_index);
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    
    
    
    
        return null;
    }
    
    private  boolean fileExists(String filePath) {
        File file = new File(filePath);
    
        return file.exists();
    }
    
    private String getPathFromExtSD(String[] pathData) {
        final String type = pathData[0];
        final String relativePath = "/" + pathData[1];
        String fullPath = "";
    
        // on my Sony devices (4.4.4 & 5.1.1), `type` is a dynamic string
        // something like "71F8-2C0A", some kind of unique id per storage
        // don't know any API that can get the root path of that storage based on its id.
        //
        // so no "primary" type, but let the check here for other devices
        if ("primary".equalsIgnoreCase(type)) {
            fullPath = Environment.getExternalStorageDirectory() + relativePath;
            if (fileExists(fullPath)) {
                return fullPath;
            }
        }
    
        // Environment.isExternalStorageRemovable() is `true` for external and internal storage
        // so we cannot relay on it.
        //
        // instead, for each possible path, check if file exists
        // we'll start with secondary storage as this could be our (physically) removable sd card
        fullPath = System.getenv("SECONDARY_STORAGE") + relativePath;
        if (fileExists(fullPath)) {
            return fullPath;
        }
    
        fullPath = System.getenv("EXTERNAL_STORAGE") + relativePath;
        if (fileExists(fullPath)) {
            return fullPath;
        }
    
        return fullPath;
    }
    
    private String getDriveFilePath(Uri uri) {
        Uri returnUri = uri;
        Cursor returnCursor = context.getContentResolver().query(returnUri, null, null, null, null);
        /*
         * Get the column indexes of the data in the Cursor,
         *     * move to the first row in the Cursor, get the data,
         *     * and display it.
         * */
        int nameIndex = returnCursor.getColumnIndex(OpenableColumns.DISPLAY_NAME);
        int sizeIndex = returnCursor.getColumnIndex(OpenableColumns.SIZE);
        returnCursor.moveToFirst();
        String name = (returnCursor.getString(nameIndex));
        String size = (Long.toString(returnCursor.getLong(sizeIndex)));
        File file = new File(context.getCacheDir(), name);
        try {
            InputStream inputStream = context.getContentResolver().openInputStream(uri);
            FileOutputStream outputStream = new FileOutputStream(file);
            int read = 0;
            int maxBufferSize = 1 * 1024 * 1024;
            int bytesAvailable = inputStream.available();
    
            //int bufferSize = 1024;
            int bufferSize = Math.min(bytesAvailable, maxBufferSize);
    
            final byte[] buffers = new byte[bufferSize];
            while ((read = inputStream.read(buffers)) != -1) {
                outputStream.write(buffers, 0, read);
            }
            Log.e("File Size", "Size " + file.length());
            inputStream.close();
            outputStream.close();
            Log.e("File Path", "Path " + file.getPath());
            Log.e("File Size", "Size " + file.length());
        } catch (Exception e) {
            Log.e("Exception", e.getMessage());
        }
        return file.getPath();
    }
    
    /***
     * Used for Android Q+
     * @param uri
     * @param newDirName if you want to create a directory, you can set this variable
     * @return
     */
    private String copyFileToInternalStorage(Uri uri,String newDirName) {
        Uri returnUri = uri;
    
        Cursor returnCursor = context.getContentResolver().query(returnUri, new String[]{
                OpenableColumns.DISPLAY_NAME,OpenableColumns.SIZE
        }, null, null, null);
    
    
        /*
         * Get the column indexes of the data in the Cursor,
         *     * move to the first row in the Cursor, get the data,
         *     * and display it.
         * */
        int nameIndex = returnCursor.getColumnIndex(OpenableColumns.DISPLAY_NAME);
        int sizeIndex = returnCursor.getColumnIndex(OpenableColumns.SIZE);
        returnCursor.moveToFirst();
        String name = (returnCursor.getString(nameIndex));
        String size = (Long.toString(returnCursor.getLong(sizeIndex)));
    
        File output;
        if(!newDirName.equals("")) {
            File dir = new File(context.getFilesDir() + "/" + newDirName);
            if (!dir.exists()) {
                dir.mkdir();
            }
            output = new File(context.getFilesDir() + "/" + newDirName + "/" + name);
        }
        else{
            output = new File(context.getFilesDir() + "/" + name);
        }
        try {
            InputStream inputStream = context.getContentResolver().openInputStream(uri);
            FileOutputStream outputStream = new FileOutputStream(output);
            int read = 0;
            int bufferSize = 1024;
            final byte[] buffers = new byte[bufferSize];
            while ((read = inputStream.read(buffers)) != -1) {
                outputStream.write(buffers, 0, read);
            }
    
            inputStream.close();
            outputStream.close();
    
        }
        catch (Exception e) {
    
            Log.e("Exception", e.getMessage());
        }
    
        return output.getPath();
    }
    
    private String getFilePathForWhatsApp(Uri uri){
            return  copyFileToInternalStorage(uri,"whatsapp");
    }
    
    private 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 index = cursor.getColumnIndexOrThrow(column);
                return cursor.getString(index);
            }
        }
        finally {
            if (cursor != null)
                cursor.close();
        }
    
        return null;
    }
    
    private  boolean isExternalStorageDocument(Uri uri) {
        return "com.android.externalstorage.documents".equals(uri.getAuthority());
    }
    
    private  boolean isDownloadsDocument(Uri uri) {
        return "com.android.providers.downloads.documents".equals(uri.getAuthority());
    }
    
    private  boolean isMediaDocument(Uri uri) {
        return "com.android.providers.media.documents".equals(uri.getAuthority());
    }
    
    private  boolean isGooglePhotosUri(Uri uri) {
        return "com.google.android.apps.photos.content".equals(uri.getAuthority());
    }
    
    public boolean isWhatsAppFile(Uri uri){
        return "com.whatsapp.provider.media".equals(uri.getAuthority());
    }
    
    private  boolean isGoogleDriveUri(Uri uri) {
        return "com.google.android.apps.docs.storage".equals(uri.getAuthority()) || "com.google.android.apps.docs.storage.legacy".equals(uri.getAuthority());
    }
    

    快乐编码。

    【讨论】:

    • 感谢您的精彩而详细的回答!也许我在这里遗漏了一些东西,但是如何修改它以获取视频的 thumbnailspath/uri?新的loadThumbnail 方法实际上并不提供缩略图文件的 uri。
    【解决方案2】:

    您不会尝试在 Android 10 中将 uri 转换为文件系统路径。

    即使你管理路径也大多不可访问。

    您不是 stackoverflow 页面的常客吗?

    【讨论】:

      【解决方案3】:

      tushar 给出的上述答案是绝对正确的,我已将该代码转换为 kotlin,可能对某人有所帮助。

      import android.annotation.SuppressLint
      import android.content.ContentUris
      import android.content.Context
      import android.database.Cursor
      import android.net.Uri
      import android.os.Build
      import android.os.Environment
      import android.provider.DocumentsContract
      import android.provider.MediaStore
      import android.provider.OpenableColumns
      import android.text.TextUtils
      import timber.log.Timber
      import java.io.File
      import java.io.FileOutputStream
      import java.io.InputStream
      import kotlin.math.min
      
      
      @SuppressLint("Recycle")
      @Suppress("RECEIVER_NULLABILITY_MISMATCH_BASED_ON_JAVA_ANNOTATIONS", "DEPRECATION")
      object FileManager {
          
          fun getPath(context: Context, uri: Uri): String? {
              // check here to KITKAT or new version
              val isKitKat = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT
              var selection: String? = null
              var selectionArgs: Array<String>? = null
              // DocumentProvider
              if (isKitKat) {
                  // ExternalStorageProvider
                  if (isExternalStorageDocument(uri)) {
                      val docId = DocumentsContract.getDocumentId(uri)
                      val split = docId.split(":".toRegex()).toTypedArray()
                      //val type = split[0]
                      val fullPath = getPathFromExtSD(split)
                      return if (fullPath !== "") {
                          fullPath
                      } else {
                          null
                      }
                  }
      
      
                  // DownloadsProvider
                  if (isDownloadsDocument(uri)) {
                      if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                          var cursor: Cursor? = null
                          try {
                              cursor = context.contentResolver.query(uri, arrayOf(MediaStore.MediaColumns.DISPLAY_NAME), null, null, null)
                              if (cursor != null && cursor.moveToFirst()) {
                                  val fileName: String = cursor.getString(0)
                                  val path: String = Environment.getExternalStorageDirectory().toString() + "/Download/" + fileName
                                  if (!TextUtils.isEmpty(path)) {
                                      return path
                                  }
                              }
                          } finally {
                              cursor?.close()
                          }
                          val id: String = DocumentsContract.getDocumentId(uri)
                          if (!TextUtils.isEmpty(id)) {
                              if (id.startsWith("raw:")) {
                                  return id.replaceFirst("raw:".toRegex(), "")
                              }
                              val contentUriPrefixesToTry = arrayOf("content://downloads/public_downloads", "content://downloads/my_downloads")
                              for (contentUriPrefix in contentUriPrefixesToTry) {
                                  return try {
                                      val contentUri: Uri = ContentUris.withAppendedId(Uri.parse(contentUriPrefix), java.lang.Long.valueOf(id))
                                      getDataColumn(context, contentUri, null, null)
                                  } catch (e: NumberFormatException) {
                                      //In Android 8 and Android P the id is not a number
                                      uri.path?.replaceFirst("^/document/raw:", "")?.replaceFirst("^raw:", "")
                                  }
                              }
                          }
                      } else {
                          val id = DocumentsContract.getDocumentId(uri)
                          if (id.startsWith("raw:")) {
                              return id.replaceFirst("raw:".toRegex(), "")
                          }
                          var contentUri : Uri?= null
                          try {
                              contentUri = ContentUris.withAppendedId(Uri.parse("content://downloads/public_downloads"), java.lang.Long.valueOf(id))
                          } catch (e: NumberFormatException) {
                              e.printStackTrace()
                          }
                          if (contentUri != null) {
                              return getDataColumn(context, contentUri, null, null)
                          }
                      }
                  }
      
      
                  // MediaProvider
                  if (isMediaDocument(uri)) {
                      val docId = DocumentsContract.getDocumentId(uri)
                      val split = docId.split(":".toRegex()).toTypedArray()
                      val type = split[0]
                      var contentUri: Uri? = null
                      when (type) {
                          "image" -> {
                              contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI
                          }
                          "video" -> {
                              contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI
                          }
                          "audio" -> {
                              contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI
                          }
                      }
                      selection = "_id=?"
                      selectionArgs = arrayOf(split[1])
                      return getDataColumn(context, contentUri!!, selection, selectionArgs)
                  }
                  if (isGoogleDriveUri(uri)) {
                      return getDriveFilePath(context,uri)
                  }
                  if (isWhatsAppFile(uri)) {
                      return getFilePathForWhatsApp(context, uri)
                  }
                  if ("content".equals(uri.scheme, ignoreCase = true)) {
                      if (isGooglePhotosUri(uri)) {
                          return uri.lastPathSegment
                      }
                      if (isGoogleDriveUri(uri)) {
                          return getDriveFilePath(context, uri)
                      }
                      return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
      
                          // return getFilePathFromURI(context,uri);
                          copyFileToInternalStorage(context, uri, "userfiles")
                          // return getRealPathFromURI(context,uri);
                      } else {
                          getDataColumn(context, uri, null, null)
                      }
                  }
                  if ("file".equals(uri.scheme, ignoreCase = true)) {
                      return uri.path
                  }
              } else {
                  if (isWhatsAppFile(uri)) {
                      return getFilePathForWhatsApp(context, uri)
                  }
                  if ("content".equals(uri.scheme, ignoreCase = true)) {
                      val projection = arrayOf(MediaStore.Images.Media.DATA)
                      val cursor: Cursor
                      try {
                          cursor = context.contentResolver.query(uri, projection, selection, selectionArgs, null)!!
                          val columnIndex: Int = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA)
                          if (cursor.moveToFirst()) {
                              return cursor.getString(columnIndex)
                          }
                      } catch (e: Exception) {
                          e.printStackTrace()
                      }
                  }
              }
              return null
          }
      
          private fun fileExists(filePath: String): Boolean {
              val file = File(filePath)
              return file.exists()
          }
      
          private fun getPathFromExtSD(pathData: Array<String>): String {
              val type = pathData[0]
              val relativePath = "/" + pathData[1]
              var fullPath : String
      
              // on my Sony devices (4.4.4 & 5.1.1), `type` is a dynamic string
              // something like "71F8-2C0A", some kind of unique id per storage
              // don't know any API that can get the root path of that storage based on its id.
              //
              // so no "primary" type, but let the check here for other devices
              if ("primary".equals(type, ignoreCase = true)) {
                  fullPath = Environment.getExternalStorageDirectory().toString() + relativePath
                  if (fileExists(fullPath)) {
                      return fullPath
                  }
              }
      
              // Environment.isExternalStorageRemovable() is `true` for external and internal storage
              // so we cannot relay on it.
              //
              // instead, for each possible path, check if file exists
              // we'll start with secondary storage as this could be our (physically) removable sd card
              fullPath = System.getenv("SECONDARY_STORAGE") + relativePath
              if (fileExists(fullPath)) {
                  return fullPath
              }
              fullPath = System.getenv("EXTERNAL_STORAGE") + relativePath
              return if (fileExists(fullPath)) {
                  fullPath
              } else fullPath
          }
          
          private fun getDriveFilePath(context: Context, uri: Uri): String? {
              val returnUri: Uri = uri
              val returnCursor: Cursor = context.contentResolver.query(returnUri, null, null, null, null)!!
              /*
           * Get the column indexes of the data in the Cursor,
           *     * move to the first row in the Cursor, get the data,
           *     * and display it.
           * */
              val nameIndex: Int = returnCursor.getColumnIndex(OpenableColumns.DISPLAY_NAME)
             // val sizeIndex: Int = returnCursor.getColumnIndex(OpenableColumns.SIZE)
              returnCursor.moveToFirst()
              val name: String = returnCursor.getString(nameIndex)
             // val size = returnCursor.getLong(sizeIndex).toString()
              val file = File(context.cacheDir, name)
              try {
                  val inputStream: InputStream? = context.contentResolver.openInputStream(uri)
                  val outputStream = FileOutputStream(file)
                  var read : Int
                  val maxBufferSize = 1 * 1024 * 1024
                  val bytesAvailable: Int = inputStream?.available()!!
      
                  //int bufferSize = 1024;
                  val bufferSize = min(bytesAvailable, maxBufferSize)
                  val buffers = ByteArray(bufferSize)
                  while (inputStream.read(buffers).also { read = it } != -1) {
                      outputStream.write(buffers, 0, read)
                  }
                  Timber.d("File Size Size ${file.length()}")
                  inputStream.close()
                  outputStream.close()
                  Timber.d("File Path Path ${file.path}")
                  Timber.d("File Size Size ${file.length()}")
              } catch (e: Exception) {
                  Timber.e("Exception ${e.message}")
              }
              return file.path
          }
      
          /***
           * Used for Android Q+
           * @param uri
           * @param newDirName if you want to create a directory, you can set this variable
           * @return
           */
          private fun copyFileToInternalStorage(context: Context, uri: Uri, newDirName: String): String? {
              val returnUri: Uri = uri
              val returnCursor: Cursor = context.contentResolver.query(returnUri, arrayOf(OpenableColumns.DISPLAY_NAME, OpenableColumns.SIZE), null, null, null)!!
      
      
              /*
           * Get the column indexes of the data in the Cursor,
           *     * move to the first row in the Cursor, get the data,
           *     * and display it.
           * */
              val nameIndex: Int = returnCursor.getColumnIndex(OpenableColumns.DISPLAY_NAME)
              //val sizeIndex: Int = returnCursor.getColumnIndex(OpenableColumns.SIZE)
              returnCursor.moveToFirst()
              val name: String = returnCursor.getString(nameIndex)
             // val size = returnCursor.getLong(sizeIndex).toString()
              val output: File = if (newDirName != "") {
                  val dir = File(context.filesDir.toString() + "/" + newDirName)
                  if (!dir.exists()) {
                      dir.mkdir()
                  }
                  File(context.filesDir.toString() + "/" + newDirName + "/" + name)
              } else {
                  File(context.filesDir.toString() + "/" + name)
              }
              try {
                  val inputStream: InputStream? = context.contentResolver.openInputStream(uri)
                  val outputStream = FileOutputStream(output)
                  var read = 0
                  val bufferSize = 1024
                  val buffers = ByteArray(bufferSize)
                  while (inputStream?.read(buffers).also {
                          if (it != null) {
                              read = it
                          }
                      } != -1) {
                      outputStream.write(buffers, 0, read)
                  }
                  inputStream?.close()
                  outputStream.close()
              } catch (e: Exception) {
                  Timber.e("Exception${e.message}")
              }
              return output.path
          }
      
          private fun getFilePathForWhatsApp(context: Context, uri: Uri): String? {
              return copyFileToInternalStorage(context, uri, "whatsapp")
          }
      
          private fun getDataColumn(context: Context, uri: Uri, selection: String?, selectionArgs: Array<String>?): String? {
              var cursor: Cursor? = null
              val column = "_data"
              val projection = arrayOf(column)
              try {
                  cursor = context.contentResolver.query(uri, projection, selection, selectionArgs, null)
                  if (cursor != null && cursor.moveToFirst()) {
                      val index: Int = cursor.getColumnIndexOrThrow(column)
                      return cursor.getString(index)
                  }
              } finally {
                  cursor?.close()
              }
              return null
          }
      
          private fun isExternalStorageDocument(uri: Uri): Boolean {
              return "com.android.externalstorage.documents" == uri.authority
          }
      
          private fun isDownloadsDocument(uri: Uri): Boolean {
              return "com.android.providers.downloads.documents" == uri.authority
          }
      
          private fun isMediaDocument(uri: Uri): Boolean {
              return "com.android.providers.media.documents" == uri.authority
          }
      
          private fun isGooglePhotosUri(uri: Uri): Boolean {
              return "com.google.android.apps.photos.content" == uri.authority
          }
      
          private fun isWhatsAppFile(uri: Uri): Boolean {
              return "com.whatsapp.provider.media" == uri.authority
          }
      
          private fun isGoogleDriveUri(uri: Uri): Boolean {
              return "com.google.android.apps.docs.storage" == uri.authority || "com.google.android.apps.docs.storage.legacy" == uri.authority
          }
      
      }
      

      启动

       val intent = Intent(ACTION_GET_CONTENT)
                  intent.apply {
                      type = "application/pdf"
                      addCategory(Intent.CATEGORY_OPENABLE)
                  }
                  resultLauncher.launch(intent)
      

      你可以在你的活动中得到结果

       private val resultLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
          if (result.resultCode == Activity.RESULT_OK) {
      
              var file: File? = null
              val disposable = Single.fromCallable {
                  val filePath = FileManager.getPath(this, result?.data?.data!!)
                  file = File(filePath)
              }.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe({
                  Timber.d("==File==Path===${file?.path}\nname==${file?.name}\nabsolutePath =${file?.absolutePath}")
      
              }, {
                  it.printStackTrace()
              })
      
      
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2015-09-11
        • 2016-10-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-12-29
        相关资源
        最近更新 更多