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



												

Android 打开文件管理器 获取文件的真实路径相关推荐

  1. win10 uwp 打开文件管理器选择文件

    本文:让文件管理器选择文件,不是从文件管理器获得文件. 假如已经获得一些文件,那么如何从文件管理器选择这些文件? 使用方法很简单. 从网上拿图来说 打开文件夹自动选择所有文件 首先需要获得文件夹,因为 ...

  2. android打开手机相册获取真正的图片路径

    版权声明:本文为博主原创文章,转载请注明地址.    https://blog.csdn.net/huangxiaoguo1/article/details/79062341 根据打开相机返回的Uri ...

  3. android nfs文件管理器,NFS 文件

    NFS 文件 任何计算机上的 NFS 活动都需要若干文件来支持.其中许多文件是 ASCII 文件,但也有一些文件是数据文件.表 6-1 中列出了这些文件及其功能. 表 6-1 NFS 文件 文件名 功 ...

  4. 打开文件管理器并进行文件夹的复制、移动、删除、创建

    打开文件管理器并进行文件夹的复制.移动.删除.创建 调文件文件管理器并获取可操作文件的DocumentFile Intent intent = new Intent(Intent.ACTION_OPE ...

  5. Android 简单文件管理器

    Android 简单文件管理器 开发环境Android studio 4.1.2 运行环境 api 22 ps api 23及以上需动态添加sd卡权限,静态添加无效 <uses-permissi ...

  6. python打开文件管理器

    python 使用win32 API打开文件管理器对话窗口代码 win10 系统进行python GUI设计时,涉及到文件打开.保存等可以使用win32 API接口来实现,使弹出的文件管理窗口更美观. ...

  7. android 简单文件管理器的实现

    学习android才一个星期,在一些资料上看见了一些例子,其中文件资源管理器的实现中科学的东西相当多. 在主页面FileManagerActivity中的代码: package com.hoperun ...

  8. Android本地文件管理器思路解析一一增删改查具体实现

    花了一天的时间撸完了Android本地文件管理器~!!GitHub下载地址为:PumpkinFileManager 南瓜文件管理器1.0. 功能列表: 1: 实现了在ListView中浏览本地所有文件 ...

  9. Linux 命令行打开文件管理器 —— nautilus

    Linux 命令行打开文件管理器 -- nautilus Reference: LINUX nautilus 命令 nautilus 是 GNOME 桌面下的一个文件管理工具. 通过这个命令我们可以在 ...

最新文章

  1. Softmax v.s. LogSoftmax
  2. linux top命令查看内存及多核CPU的使用讲述 [转]
  3. 浅析React之事件系统(二)
  4. java明星养成游戏_#IT明星不是梦#Java14不得不知的5个新功能
  5. there are no packages available for installation插件安装问题和如何配置浏览器的快捷键...
  6. 组合模式源码解析(jdk+mybatis)
  7. vue+xterm.js 实现Linux command界面
  8. Spring Boot 项目瘦身指南,瘦到不可思议!129M->1.3M
  9. HighCharts解析之xAxis——x轴的样式
  10. 开源资产管理系统_部署开源夜莺运维监控平台V3版本
  11. 使用Netty编写一个简单的群聊系统
  12. Remoting服务集成到IIS的简单总结
  13. 获取页面元素的滚动位置,兼容各浏览器
  14. BZOJ 2038 小Z的袜子(hose)(分组)
  15. select下拉选择框
  16. 搭建影视APP需要准备的工具
  17. 投影仪显示播放服务器连接异常,「投影仪维修」常见投影机故障如何解决?
  18. 2016.12.10
  19. safe6出品--社工密码字典生成器
  20. ajax实现直播功能,jquery实现直播弹幕效果

热门文章

  1. 12V转5V 5V转3.3V电路
  2. 闲鱼app关键词抓包案例,配合frida成功抓包
  3. 实现在线五子棋项目功能1
  4. k1075停运吗_途经铁路金华站的部分列车停运
  5. 揭晓 2020 年增长最快的技术职位,PHP 成为开发的潜力股!
  6. Instant的使用
  7. matlab非线性规划--简单入门
  8. ORA-00933: SQL 命令未正确结束
  9. 华为mate40可以用鸿蒙系统吗,华为Mate40可升级鸿蒙系统,除了这点之外,还有哪些地方值得关注...
  10. PMP项目管理考试 | 四式考试秘籍,宝藏级资料