您的位置:首页 > 移动开发 > Android开发

解决Android4.4及以上系统获取系统图片失败的问题,例如华为手机,调系统图库的时候就出现异常

2016-08-11 14:42 896 查看
本来我是想转载的,但是忘记原帖在哪了,但是按照下面的方法确实解决了这个棘手的问题,不墨迹,直接上代码:

补充:原文在这里 http://blog.csdn.net/tempersitu/article/details/20557383

    @Override

    protected void onActivityResult(int requestCode, int resultCode, Intent data) {

        super.onActivityResult(requestCode, resultCode, data);

        if (requestCode==0&&resultCode==RESULT_OK){

            Uri uri= data.getData();

            MLog.e("test","选择文件返回uri:"+uri+"");

            String scheme = uri.getScheme();

            if (scheme.equals("content")) {

//                String[] proj = { MediaStore.Images.Media.DATA };

//                android.database.Cursor cursor = getContentResolver().query(

//                        uri, proj, null, null, null);

//                Cursor cursor = this.managedQuery(uri, proj, null, null, null);

//                int columnindex = cursor.getColumnIndexOrThrow(proj[0]);

//                cursor.moveToFirst();

//                String path = cursor.getString(columnindex);

                String path = getPath(this,uri);

                try {

                    uploadFile(URLDecoder.decode(path,"UTF-8"));

                } catch (UnsupportedEncodingException e) {

                    e.printStackTrace();

                }

//                cursor.close();

            } else {

                try {

                    uploadFile(URLDecoder.decode(uri.getEncodedPath(),"UTF-8"));

                } catch (UnsupportedEncodingException e) {

                    e.printStackTrace();

                }

            }

        }

    }

    /**

     * <br>功能简述:4.4及以上获取图片的方法

     * <br>功能详细描述:

     * <br>注意:

     * @param context

     * @param uri

     * @return

     */

    @TargetApi(Build.VERSION_CODES.KITKAT)

    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];

                }

            }

            // 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 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 index = cursor.getColumnIndexOrThrow(column);

                return cursor.getString(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());

    }

    /**

     * @param uri The Uri to check.

     * @return Whether the Uri authority is Google Photos.

     */

    public static boolean isGooglePhotosUri(Uri uri) {

        return "com.google.android.apps.photos.content".equals(uri.getAuthority());

    }
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: