今天,简单讲讲android如何调用系统的文件管理器获取目录下的文件资源。

这几天,还是因为搬家的事,导致自己状态很差。和领导说想要辞职,领导说还是先适应一下在说。所以还是坚持了。

这个其实也很简单,之前做一个功能时需要用到,所以在网上查找了资料,这里记录一下。

Android区别于iOS的沙盒模式,可以通过文件浏览器浏览本地的存储器。Android API也提供了相应的接口。

基本思路,先通过Android API调用系统自带的文件浏览器选取文件获得URI,然后将URI转换成file,从而得到file。

调用系统自带的文件浏览器

public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Button btn= (Button) findViewById(R.id.btn);btn.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Intent intent = new Intent(Intent.ACTION_GET_CONTENT);intent.setType("*/*");//设置类型,我这里是任意类型,任意后缀的可以这样写。intent.addCategory(Intent.CATEGORY_OPENABLE);startActivityForResult(intent,1);}});}
}
 intent.setType(“image/*”);
//intent.setType(“audio/*”); //选择音频
//intent.setType(“video/*”); //选择视频 (mp4 3gp 是android支持的视频格式)
//intent.setType(“video/*;image/*”);//同时选择视频和图片

回调

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {if (resultCode == Activity.RESULT_OK) {//是否选择,没选择就不会继续Uri uri = data.getData();//得到uri,后面就是将uri转化成file的过程。String[] proj = {MediaStore.Images.Media.DATA};Cursor actualimagecursor = 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 file = new File(img_path);Toast.makeText(MainActivity.this, file.toString(), Toast.LENGTH_SHORT).show();}
}

onActivityResult函数响应了选择文件的操作。

Cursor actualimagecursor = managedQuery(uri, proj, null, null, null);

mangedQuery过时用这个代替:

Cursor actualimagecursor = getContentResolver().query(uri,proj,null,null,null);

简单讲讲,其实调用文件管理器就是使用intent跳转,设置intent.addCategory(Intent.CATEGORY_OPENABLE);就可以,还可以设置查找文件的类型,通过intent.setType("*/*")。然后在文件管理器里选择文件后,回到app的activity时,会回调onActivityResult,通过data.getData();得到文件的uri,然后获取文件的url,就可以获取文件了。具体代码上面很详细。

接下来举一个例子:

一、实现效果预览

以下为三星S6的样机测试效果,当然不同手机调用后的效果不一样。

二、代码实现

布局文件很简单,就一个Button和TextView,这里不示范了,直接上实现代码:
package com.panhouye.selectfile;import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.ContentUris;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.os.Environment;
import android.provider.DocumentsContract;
import android.provider.MediaStore;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;public class MainActivity extends AppCompatActivity {TextView tv;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Button btn = (Button) findViewById(R.id.btn);tv = (TextView) findViewById(R.id.tv);btn.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Intent intent = new Intent(Intent.ACTION_GET_CONTENT);//intent.setType(“image/*”);//选择图片//intent.setType(“audio/*”); //选择音频//intent.setType(“video/*”); //选择视频 (mp4 3gp 是android支持的视频格式)//intent.setType(“video/*;image/*”);//同时选择视频和图片intent.setType("*/*");//无类型限制intent.addCategory(Intent.CATEGORY_OPENABLE);startActivityForResult(intent, 1);}});}String path;@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {if (resultCode == Activity.RESULT_OK) {Uri uri = data.getData();if ("file".equalsIgnoreCase(uri.getScheme())){//使用第三方应用打开path = uri.getPath();tv.setText(path);Toast.makeText(this,path+"11111",Toast.LENGTH_SHORT).show();return;}if (Build.VERSION.SDK_INT > Build.VERSION_CODES.KITKAT) {//4.4以后path = getPath(this, uri);tv.setText(path);Toast.makeText(this,path,Toast.LENGTH_SHORT).show();} else {//4.4以下下系统调用方法path = getRealPathFromURI(uri);tv.setText(path);Toast.makeText(MainActivity.this, path+"222222", Toast.LENGTH_SHORT).show();}}}public String getRealPathFromURI(Uri contentUri) {String res = null;String[] proj = { MediaStore.Images.Media.DATA };Cursor cursor = getContentResolver().query(contentUri, proj, null, null, null);if(null!=cursor&&cursor.moveToFirst()){;int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);res = cursor.getString(column_index);cursor.close();}return res;}/*** 专为Android4.4设计的从Uri获取文件绝对路径,以前的方法已不好使*/@SuppressLint("NewApi")public String getPath(final Context context, final Uri uri) {final boolean isKitKat = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT;// DocumentProviderif (isKitKat && DocumentsContract.isDocumentUri(context, uri)) {// ExternalStorageProviderif (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];}}// DownloadsProviderelse 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);}// MediaProviderelse 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);}// Fileelse 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 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());}
}

简单讲讲,这个其实也是使用intent调用文件管理器,然后在onActivityResult获取文件的Uri,然后获取文件的url,对于android 4.4之前和之后的版本做了不同处理,具体的大家可以看代码,对于4.4之前的很简单,4.4之后的我也没有看懂,代码有些复杂。其实还有一种很简单的通过Uri获取url的函数:

 protected void onActivityResult(int requestCode, int resultCode, Intent data) {if (resultCode == Activity.RESULT_OK) {if (requestCode == 1) {Uri uri = data.getData();Toast.makeText(this, "文件路径:"+uri.getPath().toString(), Toast.LENGTH_SHORT).show();}}}

这个直接通过uri.getPath().toString(),获取到文件的url,我没有试过,不知道可不可以,大家可以试一下,或者在网上查找资料。

android 调用系统文件管理器就讲完了。

就这么简单。

android 调用系统文件管理器相关推荐

  1. Qt Android 调用系统文件管理

    1.了解 使用JNI扩展Qt应用 参考<Qt on Android核心编程>15章 源码https://download.csdn.net/download/dinosaurx/10149 ...

  2. android调用文件管理打开某个路径,安卓 通过intent调用系统文件管理器打开指定路径目录...

    当我们知道一个文件的路径,如何调用系统文件管理器显示它的位置呢. 代码: private void openAssignFolder(String path){ File file = new Fil ...

  3. 安卓 通过intent调用系统文件管理器打开指定路径目录

    安卓 通过intent调用系统文件管理器打开指定路径目录   转  https://blog.csdn.net/qq_34161388/article/details/78586247 当我们知道一个 ...

  4. android 调用系统播放器

    今天,简单讲讲android如何调用手机自带的播放器. 昨天,从服务器下载一个AVI的视频,下载后需要进行播放,所以想调用系统自带的播放器.但是由于很少用到,所以自己当时不知道怎么写,于是在网上查找资 ...

  5. android调用系统下载器下载文件

    在项目中使用到了在android端下载服务端的文件,之前使用的是http下载方式,现在想改成调用系统的下载器进行下载,实现步骤为: 1.得到url:文件下载地址 2.使用URL下载: (1)下载前先判 ...

  6. Android 打开系统文件管理器,并返回选中文件的路径

    职场小白迷上优美句子: 推迟,拖延真的是件可怕的事,过去了好久还是原来的样子. 公司现在的项目中有一个需求,需要把本地 json 格式的数据导入到项目中使用,其实简单的逻辑就是:使用安卓隐式跳转的方式 ...

  7. android调用系统播放器后返回的图片旋转了

    调用系统拍照后,在某些手机上可能会出现返回的照片旋转了90°/180°的情况,很头疼 使用下面两个工具方法,可以把bitmap方向调整到正确位置 /** * 读取图片属性:旋转的角度 * @param ...

  8. android 调用系统播放器播放视频,适配android 7.0以上

    1.新一个类并继承 FileProvider 类,不做其他事情 public class AppFileProvider extends FileProvider {} 2.AndroidManife ...

  9. Android调用系统自带的文件管理器,打开指定路径

    一.打开系统自带的文件管理器 if (!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {showTo ...

最新文章

  1. vue-cli3+typescript初体验
  2. Python多线程threading和多进程multiprocessing的区别及代码实现
  3. 常用 BUG 解决方法
  4. Flume实战采集文件内容存入HDFS
  5. loadClass 使用
  6. 相同风格,牛仔裤和青花瓷风行世界
  7. Atitit 前端重要概念和趋势总结 大前端 目录 1. 大前端 1 2. 三个层面上的大前端 1 2.1. 大前端与NodeJS与前后端分离 1 2.2. 微信Web 1 2.3. React
  8. 华为arm服务器虚拟化,华为云arm服务器
  9. SECS/GEM通信
  10. SOLIDWORKS教程:solidworks常用技巧大全
  11. python 基础系列(四) — Python中的面向对象
  12. 编译原理LL(1)文法-判断,first,follow,select,分析字符串
  13. 科大讯飞AIUI-应用集成6麦解决方案
  14. 【产品】产品设计:美工线的设计
  15. DELPHI窗体属性介绍
  16. Linux系统SCSI磁盘扫描机制解析及命令实例
  17. 出货量差距大幅缩短,四季度小米可望彻底击败华为!
  18. python智能图片识别系统(图片切割、图片识别、区别标识)
  19. wifi搜索不到连接不上的问题(企业局域网wifi)
  20. PPPOE拨号经常掉线问题

热门文章

  1. linux和windows两台电脑通信,synergy-两台电脑共享一套鼠标键盘-Linuxwindows详细教程...
  2. Mac 删除/卸载 自己安装的python
  3. red hart linux中文,hart是什么意思_hart的翻译_音标_读音_用法_例句_爱词霸在线词典...
  4. 注释、标识符、关键字、数据类型、类型转换
  5. 水银开关式碰撞传感器
  6. 滚雪球学 Python 第三轮,Python Web 之 Django 的世界
  7. [JVM]了断局: G1 入门
  8. 关于级联选择器Cascader数据太多会改变列表大小的问题
  9. 权限管理原理知识(一)
  10. java练习题-显示人的年龄和姓名