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 触发处理逻辑。
 
        
       
                     
                   
                    

