1. onCreate 部分

public class MainActivity extends AppCompatActivity {    Button btn;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        btn = (Button) findViewById(R.id.btn);        setOnClickListener();    }

2.setOnClickListener 监听弹出管理器部分

private void setOnClickListener() {        btn.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View view) {                //如果没有权限,申请权限                if (isGrantExternalRW(MainActivity.this)) {                    Intent intent = new Intent(Intent.ACTION_GET_CONTENT);                    intent.setType("application/msword");   //打开文件类型   Word文档                    intent.addCategory(Intent.CATEGORY_OPENABLE);                    startActivityForResult(intent, 1);                } else {                    Toast.makeText(MainActivity.this, "请检查是否开启读写权限", Toast.LENGTH_LONG).show();                }            }        });    }        /**     * 解决安卓6.0以上版本不能读取外部存储权限的问题     *     * @param activity     * @return     */    public static boolean isGrantExternalRW(Activity activity) {        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && activity.checkSelfPermission(                Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {            activity.requestPermissions(new String[]{                    Manifest.permission.READ_EXTERNAL_STORAGE,                    Manifest.permission.WRITE_EXTERNAL_STORAGE            }, 1);            return false;        }        return true;    }

3. onActivityResult获取文件路径部分
   @Override    protected void onActivityResult(int requestCode, int resultCode, Intent data) {        super.onActivityResult(requestCode, resultCode, data);        if (data == null) {            return;        }        Uri uri = data.getData();//得到uri,后面就是将uri转化成file的过程。        if(!uri.getPath().equals(filePath)){//判断是否第二次选择文件            file=null;        }        //获取到选中文件的路径        filePath = uri.getPath();        //判断是否是外部打开        if(filePath.contains("external")){            isExternal(uri);        }        //获取的是否是真实路径        if(file==null){            isWhetherTruePath(uri);        }        //如果前面都获取不到文件,则自己拼接路径        if(file==null){            splicingPath(uri);        }        Log.i("hxl", "路径转化成的file========="+file);    }

4. 拿到文件外部路径,通过外部路径遍历出真实路径
 /**     * 拿到文件外部路径,通过外部路径遍历出真实路径     * @param uri     */    private void isExternal(Uri uri){        Log.i("hxl", "获取文件的路径filePath========="+filePath);        Log.i("hxl", "===调用外部遍历出路径方法===");        String[] proj = { MediaStore.Images.Media.DATA };        Cursor actualimagecursor = this.managedQuery(uri,proj,null,null,null);        int actual_image_column_index = actualimagecursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);        actualimagecursor.moveToFirst();        String img_path = actualimagecursor.getString(actual_image_column_index);        file = new File(img_path);//        Log.i("hxl", "file========="+file);        filePath=file.getAbsolutePath();        if(!filePath.endsWith(".doc")){            Toast.makeText(MainActivity.this, "您选中的文件不是Word文档", Toast.LENGTH_LONG).show();            filePath=null;            return;        }    }

5. 判断打开文件的是那种类型
 /**     * 判断打开文件的是那种类型     * @param uri     */    private void isWhetherTruePath(Uri uri){        try {            Log.i("hxl", "获取文件的路径filePath========="+filePath);            if (filePath != null) {                if (filePath.endsWith(".doc")) {                    if ("file".equalsIgnoreCase(uri.getScheme())) {//使用第三方应用打开                        filePath = getPath(this, uri);                        Log.i("hxl", "===调用第三方应用打开===");                        fileName = filePath.substring(filePath.lastIndexOf("/") + 1);                        file = new File(filePath);                    }                    if (Build.VERSION.SDK_INT > Build.VERSION_CODES.KITKAT) {//4.4以后                        Log.i("hxl", "===调用4.4以后系统方法===");                        filePath = getRealPathFromURI(uri);                        fileName = filePath.substring(filePath.lastIndexOf("/") + 1);                        file = new File(filePath);                    } else {//4.4以下系统调用方法                        filePath = getRealPathFromURI(uri);                        Log.i("hxl", "===调用4.4以下系统方法===");                        fileName = filePath.substring(filePath.lastIndexOf("/") + 1);                        file = new File(filePath);                    }                } else {                    Toast.makeText(MainActivity.this, "您选中的文件格式不是Word文档", Toast.LENGTH_LONG).show();                }//                Log.i("hxl", "file========="+file);            }else{            }        } catch (Exception e) {            e.printStackTrace();        }    }                      /**     * 专为Android4.4设计的从Uri获取文件绝对路径,以前的方法已不好使     */    @TargetApi(Build.VERSION_CODES.KITKAT)    public 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 getDataColumn(context, uri, null, null);        }        // File        else if ("file".equalsIgnoreCase(uri.getScheme())) {            return uri.getPath();        }        return null;    }    public 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 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 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 boolean isMediaDocument(Uri uri) {        return "com.android.providers.media.documents".equals(uri.getAuthority());    }    //获取文件的真实路径    public String getRealPathFromURI(Uri contentUri) {        String res = null;        String[] proj = { MediaStore.Images.Media.DATA };        Cursor cursor = getContentResolver().query(contentUri, 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;    }                

6. 方法拼接路径,此方法在Andorid7.0系统中可用
/**     * 如果前面两种都获取不到文件     * 则使用此种方法拼接路径     * 此方法在Andorid7.0系统中可用     */    private void splicingPath(Uri uri){        Log.i("hxl", "获取文件的路径filePath========="+filePath);        if(filePath.endsWith(".doc")){            Log.i("hxl", "===调用拼接路径方法===");            String string =uri.toString();            String a[]=new String[2];            //判断文件是否在sd卡中            if (string.indexOf(String.valueOf(Environment.getExternalStorageDirectory()))!=-1){                //对Uri进行切割                a = string.split(String.valueOf(Environment.getExternalStorageDirectory()));                //获取到file                file = new File(Environment.getExternalStorageDirectory(),a[1]);            }else if(string.indexOf(String.valueOf(Environment.getDataDirectory()))!=-1) { //判断文件是否在手机内存中                //对Uri进行切割                a = string.split(String.valueOf(Environment.getDataDirectory()));                //获取到file                file = new File(Environment.getDataDirectory(), a[1]);            }//            fileName = filePath.substring(filePath.lastIndexOf("/") + 1);//            Log.i("hxl", "file========="+file);        }else{            Toast.makeText(MainActivity.this, "您选中的文件不是Word文档", Toast.LENGTH_LONG).show();        }    }

7.运行(Andorid机为7.0系统)文件截图:







 8.下图为文件选中后,路径生成的文件的Log打印:


9.文件下载demo路径

http://download.csdn.net/detail/rookie_or_beginner/9756614

   
   
   


更多相关文章

  1. Pycharm安装PyQt5的详细教程
  2. NPM 和webpack 的基础使用
  3. 【阿里云镜像】使用阿里巴巴DNS镜像源——DNS配置教程
  4. 【阿里云镜像】切换阿里巴巴开源镜像站镜像——Debian镜像
  5. Android(安卓)AGPS 定位 测试程序
  6. android fragment学习5--fragment扩展 TabLayout非自定义
  7. Android(安卓)Spinner
  8. android SD卡文件变化监控
  9. Android启动时启动Activity 的定义的位置

随机推荐

  1. modelsim经常破解失败
  2. 动画:面试算法之求二叉树的下一节点
  3. 72.打印正方形脚本
  4. 学Linux云计算技术有意义吗?如何学习linux
  5. nginx1.19.1自动安装部署脚本
  6. 利用端口扫描进行终端合规性检查的一个示
  7. 动画:散列表 | 文本编辑器是如何检查英文
  8. 认命,但就不服命!
  9. Linux学习之linux的find命令如何使用?
  10. python数据类型的强制转换