实现在微信聊天记录中的文件使用‘其他应用打开’时,将自己的uniapp做的app显示在“使用其他应用打开“的列表中
·
文章目录
前言
当我们使用uniapp开发的app,需要上传文件之类的,然后又要实现长按微信接收的文件,可以选择使用我们自己的App打开这个文件。
一、创建AndroidManifest.xml文件
在项目的更目录下创建AndroidManifest.xml文件

下面是完整的AndroidManifest.xml内容
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.app">
<application android:name=".App" android:icon="@mipmap/ic_launcher">
<activity
android:name="io.dcloud.PandoraEntry"
android:configChanges="orientation|keyboardHidden|keyboard|navigation"
android:hardwareAccelerated="true"
android:label="@string/app_name"
android:launchMode="singleTask"
android:screenOrientation="user"
android:theme="@style/TranslucentTheme"
android:windowSoftInputMode="adjustResize">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<!-- 接收分享 -->
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<data android:scheme="content"/>
<data android:mimeType="*/*" /> //接收的类型
</intent-filter>
</activity>
</application>
</manifest>
uniapp的根目录下添加这个xml后,进行打包后安装到手机上是有效的,能够实现将应用显示在"用其他应用打开"的列表中
二、接收数据
在项目中的App.vue文件中,plus.runtime.launcher == 'scheme’就是代表app的打开方式是从别的软件打开的,plus.runtime.arguments就是携带的参数,就是我们用这个app打开的文件
1.在App.vue中添加checkArguments()方法 用于接收文件

methods: {
async checkArguments() {
if (plus.runtime.launcher == 'scheme') {
var args = plus.runtime.arguments;
if (args) { //有参数就代表有应用分享文件
const filePath = await this.saveFile(args)
if(filePath){
//这里拿到文件路径后就可以携带参数跳转到相应的业务场景
}
}
}
},
saveFile(uri){
return new Promise((resolve ) =>{
// 导入所需的 Android 类
var Uri = plus.android.importClass("android.net.Uri");
var ContentResolver = plus.android.importClass("android.content.ContentResolver");
var File = plus.android.importClass("java.io.File");
var FileInputStream = plus.android.importClass("java.io.FileInputStream");
var FileOutputStream = plus.android.importClass("java.io.FileOutputStream");
var InputStream = plus.android.importClass("java.io.InputStream");
var IOException = plus.android.importClass("java.io.IOException");
var FileUtils = plus.android.importClass("android.os.FileUtils")
// 获取当前的 Activity 上下文
var context = plus.android.runtimeMainActivity();
// 解析文件 URI
var fileUri = Uri.parse(uri);
console.log('文件名:' ,fileUri.getLastPathSegment()) //根据Uri读取文件名
// 获取 ContentResolver
var resolver = context.getContentResolver();
// 使用 ContentResolver 打开输入流
var inputStream = resolver.openInputStream(fileUri);
// 创建输出文件
plus.io.requestFileSystem(plus.io.PUBLIC_DOWNLOADS,fs => {
let entry = fs.root // 拿到操作对象
// 进行创建文件夹 ,这个“share”为相对路径,最后创建来应为 /storage/emulated/0/Android/data/你的软件包名/downloads/share/文件名
entry.getDirectory('share',{create:true,exclusive:false},res=>{
// 创建成功
console.log(res.toLocalURL(),'创建成功'); //res.toLocalURL()为创建的文件夹路径,打印为file:///storage/emulated/0/Android/data/uni.liangzai/downloads/share/,所以下面我去掉了前面的file://
//这里创建Java的File对象 前面的参数为路径,后面的是文件名
var outputFile = new File(res.toLocalURL().replace(/^file:\/\//, ''), fileUri.getLastPathSegment());
// 使用 FileOutputStream 写入数据
try {
var outputStream = new FileOutputStream(outputFile);
FileUtils.copy(inputStream,outputStream) //这里使用android.os.FileUtils的copy方法去保存文件
inputStream.close(); // 关闭输入流
outputStream.close(); // 关闭输出流
console.log("文件保存地址: " + outputFile.getAbsolutePath()) //最后就打印保存好的文件名了
resolve(outputFile.getAbsolutePath())
} catch (e) {
// 捕获并打印异常
console.error("IOException occurred: " + e.toString());
}
},err=> {
console.log(err,'创建失败');
})
}
)
})
} ,
}
2.在App.vue文件的onLaunch()和onShow()生命周期中调用checkArguments方法
onLaunch: function() {
this.checkArguments()
},
onShow: function() {
this.checkArguments()
},
总结
1.添加好然后打包测试就可以实现将应用显示在"使用其他应用打开"的列表中
2.接收到数据之后就可以进行自己的页面操作了
3.这样从微信分享文件到自己app的功能就完成
注意:必须要打包后用真机测试,开发环境是不行的
更多推荐
所有评论(0)