怕忘,特此记录

  • 在你调用微信或者QQ的Activity下面加入如下,然后就可以了。
         <intent-filter><android:scheme="http"><tools:ignore="AppLinkUrlError"><action android:name="android.intent.action.VIEW" /><category android:name="android.intent.category.DEFAULT" /><data android:mimeType="*/*" /></intent-filter>
  • 路径获取
     Intent intent = getIntent();String action = intent.getAction();if (TextUtils.equals(action, Intent.ACTION_VIEW)) {Uri uri = intent.getData();if (TextUtils.equals(uri.getScheme(), "file")) {//这里是一个把uri转成String类型的路径的工具类file_path = JxdUtils.getPath(NewWordPrintActivity.this, uri);}}
  • 一切都很美好,但是有一次甲方反馈说是微信文件不能上传(这里项目的一个获取路径后的后续功能),后来去查验了许久,发现不能上传的手机均未安装QQ浏览器,这是一开始的推测,也持续撞壁了几日……

然后“众里寻他千百度,蓦然回首,那人却在灯火阑珊处”

莫名在这里找到点思路

  • 多加了个判断就好了,我猜测可能是安装QQ浏览器和未安装QQ浏览器返回的类型不一样?!May Be……
     Intent intent = getIntent();String action = intent.getAction();if (TextUtils.equals(action, Intent.ACTION_VIEW)) {Uri uri = intent.getData();if (TextUtils.equals(uri.getScheme(), "file")) {file_path = JxdUtils.getPath(NewWordPrintActivity.this, uri);……}else if (TextUtils.equals(uri.getScheme(), "content")) {file_path = JxdUtils.getPath(NewWordPrintActivity.this, uri);……}}

也是抚慰了一下这夏日炎炎里躁动的心*-*

最后贴一下用到的工具类

public class JxdUtils {@SuppressLint("NewApi")public static String getPath(final Context context, final Uri uri) {final boolean isKitKat = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT;// 文档if (isKitKat && DocumentsContract.isDocumentUri(context, uri)) {// 外部存储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];}}// 下载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);}// 多媒体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);}}// 4.4以下  多媒体路径else if ("content".equalsIgnoreCase(uri.getScheme())) {return getDataColumn(context, uri, null, null);}// 文件路径else if ("file".equalsIgnoreCase(uri.getScheme())) {return uri.getPath();}return null;}/*** 获取Uri的数据列的值** @param context       context* @param uri           需要查询的uri* @param selection     过滤条件* @param selectionArgs 过滤值* @return _data的值 一般是文件路径*/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);}} catch (IllegalArgumentException e) {return getFilePathFromURI(context, uri);} finally {if (cursor != null)cursor.close();}return null;}//判断是否为外部存储文档public static boolean isExternalStorageDocument(Uri uri) {return "com.android.externalstorage.documents".equals(uri.getAuthority());}//判断是否是下载目录中的文档public static boolean isDownloadsDocument(Uri uri) {return "com.android.providers.downloads.documents".equals(uri.getAuthority());}//判断是否是多媒体目录文档public static boolean isMediaDocument(Uri uri) {return "com.android.providers.media.documents".equals(uri.getAuthority());}//部分文件可能无法读取到正确的URI  所以复制临时文件作为传输public static String getFilePathFromURI(Context context, Uri contentUri) {//copy file and send new file pathString fileName = getFileName(contentUri);if (!TextUtils.isEmpty(fileName)) {File copyFile = new File(context.getFilesDir() + File.separator + fileName);copy(context, contentUri, copyFile);return copyFile.getAbsolutePath();}return null;}public static String getFileName(Uri uri) {if (uri == null) return null;String fileName = null;String path = uri.getPath();if (path == null) return null;int cut = path.lastIndexOf('/');if (cut != -1) {fileName = path.substring(cut + 1);}return fileName;}public static void copy(Context context, Uri srcUri, File dstFile) {try {InputStream inputStream = context.getContentResolver().openInputStream(srcUri);if (inputStream == null) return;OutputStream outputStream = new FileOutputStream(dstFile);copyFile(inputStream, outputStream);inputStream.close();outputStream.close();} catch (IOException e) {e.printStackTrace();}}private static void copyFile(InputStream inputStream, OutputStream outputStream) throws IOException {int BUFFER_SIZE = 1024 * 2;byte[] buffer = new byte[BUFFER_SIZE];BufferedInputStream in = new BufferedInputStream(inputStream, BUFFER_SIZE);BufferedOutputStream out = new BufferedOutputStream(outputStream, BUFFER_SIZE);int n;try {while ((n = in.read(buffer, 0, BUFFER_SIZE)) != -1) {out.write(buffer, 0, n);}out.flush();} finally {try {out.close();} catch (IOException e) {}try {in.close();} catch (IOException e) {}}}}

微信文件指定应用打开并获取文件路径,以及遇到的一个坑相关推荐

  1. Winform中使用OpenFileDialog选择文件打开并获取文件路径

    场景 在Windform中进行Excel导入时往往需要先将Excel文件打开并获取文件的路径,这时需要使用OpenFileDialog. OpenFileDialog 显示一个标准对话框,提示用户打开 ...

  2. java android 读取微信文件,Android 实现微信,QQ文件在其他应用打开并获取到路径

    例如: 1.想实现其他应用打开出现自己的应用,需要在清单文件中增加配置 注:自己需要什么样的文件格式自己可以配置,其中 minType 代表要打开的文件类型. 常用的类型: {".3gp&q ...

  3. 【Android 逆向】x86 汇编 ( 使用 IDA 解析 x86 架构的动态库文件 | 使用 IDA 打开动态库文件 | IDA 中查找指定的方法 )

    文章目录 一.使用 IDA 打开动态库文件 二.IDA 中查找指定的方法 一.使用 IDA 打开动态库文件 分析 Android SDK 中的 x86 架构的动态库 , 动态库位置 : D:\001_ ...

  4. php页面文件后缀名,PHP中获取文件扩展名的N种方法

    PHP中获取文件扩展名的N种方法 从网上收罗的,基本上就以下这几种方式: 第1种方法: function get_extension($file) { substr(strrchr($file, '. ...

  5. python用glob遍历文件_python中用glob快速获取文件列表

    glob是python自带的一个操作文件的相关模块,由于模块功能比较少,所以很容易掌握.用它可以查找符合特定规则的文件路径名.使用该模块查找文件,只需要用到: "*", " ...

  6. 客户端打开服务器txt文件夹,客户端打开服务器txt文件夹

    客户端打开服务器txt文件夹 内容精选 换一换 Windows场景中,当把源端服务器迁移到华为云后,目的端服务器C盘的已用空间比对应源端服务器C盘的已用空间大至少1GB,而不是与源端服务器C盘的已用空 ...

  7. linux文件操作篇打开和关闭文件

    2.1 打开文件和关闭文件 #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h>  头文件 ...

  8. java获取vdx文件数据_通过文件名获取文件类型ContentType

    第一种方法: 引用System.Web.dll v4.5,就可以通过var mimeType = MimeMapping.GetMimeMapping(fileName);直接获取文件类型 第二种方法 ...

  9. c++判断文件是否被修改(获取文件的MD5值)

    需求分析 因为项目中需要检测一个文件是否被篡改,我采用了监测文件的MD5值. MD5,简单地来说,就是文件的"指纹".如果原始文件被修改了,那么MD5值也就会跟着发生变化,所以我们 ...

  10. python 文件指定位置写入-Python从文件中读取指定的行以及在文件指定位置写入...

    Python从文件中读取指定的行 如果想根据给出的行号, 从文本文件中读取一行数据, Python标准库linecache模块非常适合这个任务: 测试文件内容 :This is line 1. Thi ...

最新文章

  1. Unity3D与Leap motion连接学习记录
  2. svn clean up 出错解决方案
  3. [z]IE6各种不兼容问题
  4. Linux_CentOS-服务器搭建 六
  5. .Net Core Configuration Etcd数据源
  6. ENABLING SPIKE-BASED BACKPROPAGATION FOR TRAINING DEEP NEURAL NETWORK ARCHITECTURES
  7. 做游戏,学编程(C语言) 21 台球
  8. 【WPA三维路径规划】基于matlab狼群算法无人机三维路径规划【含Matlab源码 167期】
  9. 【Visual C++】游戏开发笔记十四 游戏画面绘图(四) 华丽的CImage类
  10. 【Python】使用网络调试助手传输数据(UDP协议)
  11. 2020认证杯第二阶段选提建议
  12. 挠场的科学丨五、二十一世纪的挠力文明
  13. 如何使用Java计算闰年?
  14. 解决微软应用商店打不开 代码: 0x80131500
  15. ESXI下安装OpenWrt/LEDE软路由教程(附超全功能固件镜像下载)
  16. odoo中关于打印word格式的文件,利用docxtemplate方法
  17. Spring Boot 2.x基础教程:使用Spring Data JPA访问MySQL我们得从哪入手
  18. Java 中的get set方法快捷键和含义
  19. 操作系统核心知识与重难点
  20. 网易云音乐插件v2.8.2 安卓版

热门文章

  1. 微信小程序项目实例SSM在线考试管理系统+后台
  2. PS调色技巧及HSB调色原理
  3. java使用memcached
  4. 谷歌浏览器任何页面崩溃解决方法
  5. 【转载】:马家寨:揭开陈圆圆携吴三桂后裔隐藏与繁衍真相
  6. excel如何把多张表合并成一个表_如何快速把多个excel表合并成一个excel表?
  7. Kubernetes-Host网络模式,指定Pod 物理机IP
  8. php两张图片合成,php多张图片合成一张的方法及案例
  9. UCOSII 学习笔记(卢有亮视频相关习题)
  10. 读书札记:一些常用计算机管理命令