Android(安卓)打开文件管理器 获取文件的真实路径
16lz
2021-12-04
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
更多相关文章
- Pycharm安装PyQt5的详细教程
- NPM 和webpack 的基础使用
- 【阿里云镜像】使用阿里巴巴DNS镜像源——DNS配置教程
- 【阿里云镜像】切换阿里巴巴开源镜像站镜像——Debian镜像
- Android(安卓)AGPS 定位 测试程序
- android fragment学习5--fragment扩展 TabLayout非自定义
- Android(安卓)Spinner
- android SD卡文件变化监控
- Android启动时启动Activity 的定义的位置