前言

当我们使用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的功能就完成

注意:必须要打包后用真机测试,开发环境是不行的

更多推荐