You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android设备视频分享至WhatsApp(含商业版)实现方案咨询

适配WhatsApp普通版与商业版的视频分享方案

嘿,这个问题我之前也碰到过!WhatsApp普通版(com.whatsapp)和商业版(com.whatsapp.w4b)包名不同,直接指定单个包名肯定没法同时适配,给你两种靠谱的解决方案:

方案一:检测已安装版本,动态构建分享Intent

这种方式会先检查设备上安装了哪个版本的WhatsApp,然后针对性地启动分享;如果两个都装了,就弹出选择器让用户选。

首先,先写一个辅助方法用来检测App是否安装:

private boolean isAppInstalled(String packageName) {
    try {
        getPackageManager().getApplicationInfo(packageName, 0);
        return true;
    } catch (PackageManager.NameNotFoundException e) {
        return false;
    }
}

然后修改你的分享方法,适配两个版本:

public void shareVideoToWhatsApp() throws IOException {
    File SDCardRoot = Environment.getExternalStorageDirectory();
    String fileName = "test.mp4";
    File videoFile = new File(SDCardRoot, fileName);
    
    // 适配Android 7.0+,用FileProvider获取文件Uri
    Uri videoUri = FileProvider.getUriForFile(this, BuildConfig.APPLICATION_ID + ".provider", videoFile);
    
    // 定义WhatsApp的两个官方包名
    String[] whatsAppPackages = {"com.whatsapp", "com.whatsapp.w4b"};
    
    // 收集所有可用的WhatsApp分享Intent
    List<Intent> intentList = new ArrayList<>();
    Intent baseShareIntent = new Intent(Intent.ACTION_SEND);
    baseShareIntent.setType("video/*");
    baseShareIntent.putExtra(Intent.EXTRA_STREAM, videoUri);
    baseShareIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
    
    for (String packageName : whatsAppPackages) {
        if (isAppInstalled(packageName)) {
            Intent targetedIntent = new Intent(baseShareIntent);
            targetedIntent.setPackage(packageName);
            intentList.add(targetedIntent);
        }
    }
    
    if (intentList.isEmpty()) {
        // 没有安装任何版本的WhatsApp,提示用户
        Toast.makeText(this, "未安装WhatsApp应用", Toast.LENGTH_SHORT).show();
        return;
    } else if (intentList.size() == 1) {
        // 只安装了一个版本,直接启动分享
        startActivity(intentList.get(0));
    } else {
        // 两个版本都装了,弹出选择器让用户选
        Intent chooserIntent = Intent.createChooser(intentList.remove(0), "选择要分享的WhatsApp版本");
        chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, intentList.toArray(new Parcelable[0]));
        startActivity(chooserIntent);
    }
}

方案二:通过系统选择器过滤WhatsApp应用

这种方式会先获取所有能处理视频分享的应用,然后只保留WhatsApp相关的,再弹出选择器。适合不想手动检测包名的场景:

public void shareVideoWithFilteredChooser() throws IOException {
    File SDCardRoot = Environment.getExternalStorageDirectory();
    String fileName = "test.mp4";
    File videoFile = new File(SDCardRoot, fileName);
    
    Uri videoUri = FileProvider.getUriForFile(this, BuildConfig.APPLICATION_ID + ".provider", videoFile);
    
    Intent baseShareIntent = new Intent(Intent.ACTION_SEND);
    baseShareIntent.setType("video/*");
    baseShareIntent.putExtra(Intent.EXTRA_STREAM, videoUri);
    baseShareIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
    
    // 获取所有能处理该分享Intent的应用信息
    List<ResolveInfo> resolveInfoList = getPackageManager().queryIntentActivities(baseShareIntent, PackageManager.MATCH_DEFAULT_ONLY);
    
    List<Intent> targetedIntents = new ArrayList<>();
    for (ResolveInfo info : resolveInfoList) {
        String packageName = info.activityInfo.packageName;
        // 只保留WhatsApp的两个版本
        if (packageName.equals("com.whatsapp") || packageName.equals("com.whatsapp.w4b")) {
            Intent filteredIntent = new Intent(baseShareIntent);
            filteredIntent.setPackage(packageName);
            targetedIntents.add(filteredIntent);
        }
    }
    
    if (!targetedIntents.isEmpty()) {
        Intent chooser = Intent.createChooser(targetedIntents.remove(0), "选择WhatsApp版本");
        chooser.putExtra(Intent.EXTRA_INITIAL_INTENTS, targetedIntents.toArray(new Parcelable[0]));
        startActivity(chooser);
    } else {
        Toast.makeText(this, "未安装WhatsApp应用", Toast.LENGTH_SHORT).show();
    }
}

重要注意事项

  • FileProvider配置:确保你已经在AndroidManifest.xml中注册了FileProvider,并且在res/xml目录下配置了正确的paths文件,否则会出现Uri权限异常。
  • 存储权限:Android 6.0及以上版本需要动态申请存储读写权限;Android 10+建议使用Scoped Storage来访问文件,避免权限问题。
  • 测试场景:记得分别测试只装普通版、只装商业版、两个版本都装的三种场景,确保逻辑正常。

内容的提问来源于stack exchange,提问作者Nikeshh Vijayabaskaran

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:24:27