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

如何让Android接收应用仅过滤特定应用发来的视频URL Intent?

解决方案

要实现仅接收特定应用(如Facebook)发来的视频URL Intent,需要分两步处理:Manifest配置调整 + 代码层校验。

1. 调整Manifest中的Intent Filter,匹配视频相关Intent

现有配置仅限定了https scheme,未针对视频类型做过滤。修改后的Intent Filter可同时匹配直接分享视频文件(video/*类型)和视频URL(text/plain类型且为HTTPS链接)的场景:

<intent-filter>
    <action android:name="android.intent.action.SEND" />
    <category android:name="android.intent.category.DEFAULT" />
    <!-- 匹配直接分享的本地视频文件 -->
    <data android:mimeType="video/*" />
    <!-- 匹配视频URL分享(多数应用会用text/plain传递链接) -->
    <data android:mimeType="text/plain" />
    <data android:scheme="https" />
</intent-filter>

若只需要接收视频URL(无需处理本地视频文件),可移除video/*的mimeType配置,仅保留text/plain和https scheme。

2. 在代码层校验发送方应用与数据有效性

Android的Manifest无法直接限制Intent的发送方,必须在接收Intent的Activity中做校验:

校验发送方包名

在Activity的onCreate或onNewIntent方法中,获取发送方的包名,判断是否为目标应用(Facebook官方包名是com.facebook.katana):

import android.content.pm.PackageManager;
import android.os.Bundle;
import android.util.Log;
import androidx.appcompat.app.AppCompatActivity;
import java.util.Arrays;

public class VideoReceiveActivity extends AppCompatActivity {
    // 目标应用包名(Facebook),需支持Lite版可添加com.facebook.lite
    private static final String TARGET_PACKAGE = "com.facebook.katana";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_video_receive);

        // 先校验发送方是否合法
        if (!isFromTargetApp()) {
            finish();
            return;
        }

        // 再校验是否为有效视频URL/文件
        if (!isValidVideoIntent(getIntent())) {
            finish();
            return;
        }

        // 处理合法的视频Intent
        processVideoIntent(getIntent());
    }

    private boolean isFromTargetApp() {
        int callingUid = getCallingUid();
        PackageManager pm = getPackageManager();
        String[] packages = pm.getPackagesForUid(callingUid);
        return packages != null && Arrays.asList(packages).contains(TARGET_PACKAGE);
    }

    private boolean isValidVideoIntent(android.content.Intent intent) {
        String type = intent.getType();
        if (type == null) return false;

        // 直接匹配视频文件类型
        if (type.startsWith("video/")) {
            return intent.getParcelableExtra(android.content.Intent.EXTRA_STREAM) != null;
        }

        // 匹配文本类型的视频URL(简单校验后缀或域名)
        if ("text/plain".equals(type)) {
            String url = intent.getStringExtra(android.content.Intent.EXTRA_TEXT);
            if (url == null) return false;
            String lowerUrl = url.toLowerCase();
            // 常见视频后缀
            String[] videoExts = {".mp4", ".avi", ".mov", ".mkv", ".webm"};
            for (String ext : videoExts) {
                if (lowerUrl.contains(ext)) return true;
            }
            // 匹配Facebook视频域名
            return lowerUrl.contains("fb.watch") || lowerUrl.contains("facebook.com/video");
        }
        return false;
    }

    private void processVideoIntent(android.content.Intent intent) {
        String videoContent = null;
        if (intent.getType().startsWith("video/")) {
            // 处理本地视频文件的Uri
            videoContent = intent.getParcelableExtra(android.content.Intent.EXTRA_STREAM).toString();
        } else {
            // 处理视频URL
            videoContent = intent.getStringExtra(android.content.Intent.EXTRA_TEXT);
        }
        Log.d("VideoReceiver", "合法视频内容:" + videoContent);
        // 后续业务逻辑(如播放、下载等)
    }
}

注意事项

  • 若需支持Facebook的其他版本(如Lite版),需在TARGET_PACKAGE中添加对应包名(com.facebook.lite)并调整校验逻辑。
  • 视频URL的校验逻辑可根据需求扩展,比如通过网络请求判断资源类型,但会增加耗时,建议优先做本地简单校验。

内容的提问来源于stack exchange,提问作者Laura Bieber

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 14:22:44