Android --- ACTION

Android --- ACTION,第1张

Android --- ACTION

       手机可以使用微信、QQ、蓝牙等应用对文字、图片等资源进行分享。安卓系统本身可以很简便的实现分享功能,因为我们只需向startActivity传递一个 ACTION_SEND 的Intent,系统就为我们d出一个应用程序列表,如果我们再指定intent为chooser的方式,那么这个列表就能每次都出现而且都是相同的 *** 作。 
       使用ACTION_SENDd出的应用程序列表展示的是系统中所有可以进行分享的应用,本文分享的是过滤掉指定的应用不展示在应用程序列表中。

使用ACTION_SENDd出应用程序列表进行文件分享

        //new一个intent
        Intent intent = new Intent();
        //ACTION_SEND:该action表明该intent用于从一个activity发送数据到另外一个activity的,甚至可以是跨进程的数据发送
        intent.setAction(Intent.ACTION_SEND);
        //放入分享内容
        intent.putExtra(Intent.EXTRA_TEXT,"文字分享");
        //设置分享的类型
        intent.setType("text/plain");
        //最后通过createChooser展示符合分享条件的应用列表
        startActivity(Intent.createChooser(intent,"选择分享应用"));

如果想要去掉蓝牙的分享方式

可以通过获取可分享列表然后再添加内容

        //获取匹配的应用列表信息
        List resolveInfos = this.getPackageManager().queryIntentActivities(intent,0);
        //设置一个集合存放过滤指定应用后的应用集合
        List targetedShareIntents = new ArrayList();
        //遍历这个集合,过滤掉我们不想要分享的应用
        for (ResolveInfo info : resolveInfos) {
            Intent targeted = new Intent();
            targeted.setType("text/plain");
            //获取应用info
            ActivityInfo activityInfo = info.activityInfo;
            //过滤掉蓝牙分享
            if (activityInfo.packageName.contains("bluetooth") || activityInfo.name.contains("bluetooth")) {
                continue;
            }
            //将过滤后的应用方法targeted中
            targeted.setPackage(activityInfo.packageName);
            //将targeted放到预先new好的targetedShareIntents集合中
            targetedShareIntents.add(targeted);
        }
        //显示一个供用户选择的应用列表
        Intent chooserIntent = new Intent(Intent.ACTION_CHOOSER);
        //最终展示符合createChooser第一个参数的应用以及由EXTRA_INTENT_INTENTS指定的应用
        chooserIntent.putExtra(Intent.EXTRA_INTENT,targetedShareIntents.remove(0));
        if (chooserIntent == null) {
            return;
        }
        chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, targetedShareIntents.toArray(new Parcelable[] {}));
        startActivity(Intent.createChooser(chooserIntent,"选择分享应用"));

但是这样写会存在很大的问题。

在Android 7.0及以上系统,限制了file域的访问,导致进行intent分享的时候,会报错甚至崩溃。

我们需要在App启动的时候在Application的onCreate方法中添加如下代码,解除对file域访问的限制:

        if(Build.VERSION.SDK_INT >= 24) {
            Builder builder = new Builder();
            StrictMode.setVmPolicy(builder.build());
        }

Google表示,在“N”版本之后您可以使用黑名单的方式来代替白名单。

我们可以使用以下方法进行过滤(代码中有太多地方进行了ACTION_SEND调用,所以我将方法写进工具类中)

public static Intent FilterBluetooth(Intent intent, String intentType, PackageManager pm){
        Intent chooser = Intent.createChooser(intent, "Complete action using");
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
            ArrayList targets = new ArrayList<>();
            //Remove bluetooth which has a broken share intent
            for (ResolveInfo candidate : pm.queryIntentActivities(intent, 0)) {
                String packageName = candidate.activityInfo.packageName;
                String AppName = candidate.activityInfo.name;
                if (packageName.toLowerCase().contains("bluetooth")) {
                    targets.add(new ComponentName(packageName, AppName));
                }
            }
            chooser.putExtra(Intent.EXTRA_EXCLUDE_COMPONENTS, targets.toArray(new ComponentName[0]));
        }
        return chooser;
}

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5686076.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存