android读取系统相册返回为空的解决办法

来源:互联网 发布:陀思妥耶夫斯基 知乎 编辑:程序博客网 时间:2024/05/18 16:57

读取系统相册为空的问题,今天遇到过了,找到了解决办法,写出来记录一下


关于个别手机读取到相册为空,可能的原因是系统版本问题,4.4系统在获取系统返回的相册的url的时候,有可能出现为null的问题,解决办法来自网上

/**  * Get a file path from a Uri. This will get the the path for Storage Access  * Framework Documents, as well as the _data field for the MediaStore and  * other file-based ContentProviders.  *  * @param context The context.  * @param uri The Uri to query.  * @author paulburke  */  public 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.  */  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);          }      } finally {          if (cursor != null)              cursor.close();      }      return null;  }      /**  * @param uri The Uri to check.  * @return Whether the Uri authority is ExternalStorageProvider.  */  public 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.  */  public 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.  */  public static boolean isMediaDocument(Uri uri) {      return "com.android.providers.media.documents".equals(uri.getAuthority());  }  


例子

Uri uri = data.getData();FileInputStream fis = new FileInputStream(getPath(getBaseContext(),uri));

对获取的到的url进行转换,就可以避免这个问题的发生了


0 0
原创粉丝点击