uniapp开发的安卓应用如何加入到文件分享列表
我在用uniapp开发一个安卓应用,想让应用出现在系统的文件分享列表中(比如用户分享图片时能看到我的应用),但不知道怎么实现。需要配置哪些AndroidManifest.xml参数?有没有具体的代码示例?用uniapp的云打包和本地打包有区别吗?
2 回复
在pages.json中配置分享页面的path和style,然后在分享页面使用uni.share API调用系统分享功能,将文件路径传入即可。
在 UniApp 开发的安卓应用中,若要让应用出现在系统的文件分享列表(例如分享图片、文档时),需要配置 Intent Filter,并处理接收的分享数据。以下是实现步骤:
1. 配置 AndroidManifest.xml
在 manifest.json 或原生 AndroidManifest.xml 中添加 Intent Filter,以注册应用响应分享动作。以下以图片和文本分享为例:
// 在 manifest.json 的 "app-plus" -> "distribute" -> "plugins" -> "android" 中添加:
{
"plugins": {
"share": {
"schemes": ["file", "content"],
"mimeTypes": ["image/*", "text/plain"]
}
}
}
或直接配置原生 AndroidManifest.xml(如使用原生插件):
<activity android:name=".YourActivity">
<intent-filter>
<action android:name="android.intent.action.SEND" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="image/*" />
<data android:mimeType="text/plain" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.SEND_MULTIPLE" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="image/*" />
</intent-filter>
</activity>
2. 在 UniApp 中处理分享数据
在应用启动页或指定页面(如首页)的 onLaunch 或 onShow 生命周期中,通过 plus.runtime.arguments 获取分享内容:
// 在 App.vue 或首页的 onShow 中
onShow: function(options) {
// 检查是否有分享数据
let intent = plus.runtime.arguments;
if (intent) {
// 解析 Intent 数据(示例为 Android 平台)
if (plus.os.name === 'Android') {
plus.runtime.getProperty(plus.runtime.appid, (widgetInfo) => {
let main = plus.android.runtimeMainActivity();
let intent = main.getIntent();
let action = intent.getAction();
if (action === 'android.intent.action.SEND') {
let uri = intent.getParcelableExtra('android.intent.extra.STREAM');
let type = intent.getType();
// 处理单文件分享(如图片)
if (type.startsWith('image/')) {
let filePath = resolveFilePath(uri); // 将 URI 转换为实际路径
console.log('分享的图片路径:', filePath);
// 跳转到处理页面并传递 filePath
} else if (type === 'text/plain') {
let text = intent.getStringExtra('android.intent.extra.TEXT');
console.log('分享的文本:', text);
}
} else if (action === 'android.intent.action.SEND_MULTIPLE') {
// 处理多文件分享
let uris = intent.getParcelableArrayListExtra('android.intent.extra.STREAM');
let filePaths = uris.map(uri => resolveFilePath(uri));
console.log('多文件分享路径:', filePaths);
}
});
}
}
}
// 辅助函数:将 content:// URI 转换为文件路径
function resolveFilePath(uri) {
let Context = plus.android.importClass('android.content.Context');
let main = plus.android.runtimeMainActivity();
let contentResolver = main.getContentResolver();
let cursor = contentResolver.query(uri, null, null, null, null);
if (cursor != null && cursor.moveToFirst()) {
let index = cursor.getColumnIndex('_data');
let path = cursor.getString(index);
cursor.close();
return path;
}
return null;
}
3. 注意事项
- 权限申请:在
manifest.json中申请文件读取权限:{ "permissions": [ "android.permission.READ_EXTERNAL_STORAGE" ] } - 平台兼容性:以上代码主要针对 Android,iOS 配置方式不同。
- 路径处理:Android 10+ 需适配 Scoped Storage,建议使用
ContentResolver处理 URI。
完成配置后,编译应用安装到设备,分享文件时你的应用将出现在分享列表中。选择应用后,数据会通过 onShow 触发处理逻辑。

