• Android学习笔记(四)--Android4.4中获取资源路径问题,改进文件选择器。


        最近要做一个APP使用到文件选择,碰到4.4.2版本的手机就会出错,原来发现4.4获取资源路径已经改过了。

        关于Android4.4的图片路径获取,如果回来的Uri的格式有两种:

      Version 4.4.2 出现之前,Intent.ACTION_GET_CONTENT打开相册会返回如下形式的Uri :

      content://media/external/images/media/3951 ,

      使用ContentResolver查询MediaStore.Images.Media.DATA就可以找文件的URL, 然而在Google Nexus 7 上用同样的方法,却是返回如下Uri :

      content://com.android.providers.media.documents/document/image:3951

    综合网上的方法,下面是经过测试可以正常使用的文件选择器。

    1.首先 需要添加权限。

    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

    2.showFileChooser函数

        private void showFileChooser(int file_code) {
            Intent intent = new Intent(Intent.ACTION_GET_CONTENT); 
    //        Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
    //        Intent intent = new Intent(Intent.ACTION_PICK);
    
            intent.setType("image/*"); 
            intent.addCategory(Intent.CATEGORY_OPENABLE);
         
            try {
                startActivityForResult( Intent.createChooser(intent, "Select a File to Upload"), file_code);
            } catch (android.content.ActivityNotFoundException ex) {
                Toast.makeText(getActivity(), "Please install a File Manager.",  Toast.LENGTH_SHORT).show();
            }
        }

    3.返回结果处理(由于项目需要 case比较多,根据实际需求来增减)

        public void onActivityResult(int requestCode, int resultCode, Intent data) {
               switch (requestCode) {
                case 0:      
                if (resultCode == Activity.RESULT_OK) {  
                    Uri uri = data.getData();
                    String path = FileUtils.getPath(getActivity().getApplicationContext(), uri);
                    
                    mTextViewMain.setText(path);
                    mainurl=new File(path);
                }           
                break;
                
                case 1:      
                if (resultCode == Activity.RESULT_OK) {  
                    // Get the Uri of the selected file 
                    Uri uri = data.getData();
                    String path = FileUtils.getPath(getActivity(), uri);
                    mTextViewBody1.setText(path);
                    body1=new File(path);
                }           
                break;
                
                case 2:      
                if (resultCode == Activity.RESULT_OK) {  
                    // Get the Uri of the selected file 
                    Uri uri = data.getData();
                    String path = FileUtils.getPath(getActivity(), uri);
                    mTextViewBody2.setText(path);
                    body2=new File(path);
                }           
                break;
                
                case 3:      
                if (resultCode == Activity.RESULT_OK) {  
                    // Get the Uri of the selected file 
                    Uri uri = data.getData();
                    String path = FileUtils.getPath(getActivity(), uri);
                    mTextViewBody3.setText(path);
                    body3=new File(path);
                }           
                break;
                
                case 4:      
                if (resultCode == Activity.RESULT_OK) {  
                    // Get the Uri of the selected file 
                    Uri uri = data.getData();
                    String path = FileUtils.getPath(getActivity(), uri);
                    mTextViewBody4.setText(path);
                    body4=new File(path);
                }           
                break;
                
                
            }
        super.onActivityResult(requestCode, resultCode, data);        
    
            
        }
        

    4.FileUtils类(转载于:http://stackoverflow.com/questions/20067508/get-real-path-from-uri-android-kitkat-new-storage-access-framework)

    public class FileUtils {/**
         * 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());
        }}
  • 相关阅读:
    特征的处理
    Pandas读取文件
    标准化数据-StandardScaler
    hibernate 继承映射
    hibernate 多对多关联映射
    hibernate 一对一关联映射
    hibernate 一对多 单双向关联
    hibernate配置文件
    spring整合struts2
    AWS云教育账号创建以及搭建数据库
  • 原文地址:https://www.cnblogs.com/birdhack/p/3843053.html
Copyright © 2020-2023  润新知