第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機(jī)立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

根據(jù)安裝的Android軟件包名稱自定義過濾意圖選擇器

根據(jù)安裝的Android軟件包名稱自定義過濾意圖選擇器

一只萌萌小番薯 2019-07-26 14:44:48
根據(jù)安裝的Android軟件包名稱自定義過濾意圖選擇器我想利用內(nèi)置的意圖選擇器來顯示自定義過濾的應(yīng)用列表,供用戶選擇和啟動。我知道如何獲取已安裝的軟件包列表:final Intent myIntent = new Intent(android.content.Intent.ACTION_MAIN);  List<ResolveInfo> resInfoList = getPackageManager().queryIntentActivities(myIntent, 0);此時,我想根據(jù)包名稱中包含的特定字符串(或字符串的變體)過濾列表,我也可以弄清楚如何操作。但是這里我被卡住了。據(jù)我所知,Intent.createChooser()只需要一個目標(biāo)Intent作為參數(shù)。我希望有一個重載基于包和類名或其他東西的意圖列表。但我沒有看到類似的東西。我在某處錯過了嗎?所以問題是,這可能與內(nèi)置選擇器有關(guān),還是我必須使用AlertDialog Builder構(gòu)建自己的選擇器?我希望避免后者。提前致謝。
查看完整描述

3 回答

?
瀟瀟雨雨

TA貢獻(xiàn)1833條經(jīng)驗 獲得超4個贊

選擇器的唯一附加參數(shù)是Intent.EXTRA_INITIAL_INTENTS。它的描述是:

一個Parcelable []的Intent或LabeledIntent對象,使用putExtra(String,Parcelable [])設(shè)置其他活動,以便在向用戶顯示ACTION_CHOOSER時放置選項列表的前面。

我沒有在Android源代碼中找到任何方法從列表中排除其他活動,因此似乎無法使用選擇器執(zhí)行您想要執(zhí)行的操作。

編輯:這很容易找到。只需檢查ChooserActivityResolverActivity源代碼即可。這些課程相當(dāng)小。


查看完整回答
1 反對 回復(fù) 2019-07-26
?
POPMUISE

TA貢獻(xiàn)1765條經(jīng)驗 獲得超5個贊

我做了一個小修改,以獲得您想要通過名稱共享的應(yīng)用程序列表。它幾乎就是您已發(fā)布的內(nèi)容,但添加的應(yīng)用程序按名稱共享

String[] nameOfAppsToShareWith = new String[] { "facebook", "twitter", "gmail" };String[] blacklist = new String[]{"com.any.package", "net.other.package"};// your share intentIntent intent = new Intent(Intent.ACTION_SEND);intent.setType("text/plain");intent.putExtra(Intent.EXTRA_TEXT, "some text");intent.putExtra(android.content.Intent.EXTRA_SUBJECT, "a subject");// ... anything else you want to add invoke custom chooserstartActivity(generateCustomChooserIntent(intent, blacklist));private Intent generateCustomChooserIntent(Intent prototype,
            String[] forbiddenChoices)
    {
        List<Intent> targetedShareIntents = new ArrayList<Intent>();
        List<HashMap<String, String>> intentMetaInfo = new ArrayList<HashMap<String, String>>();
        Intent chooserIntent;

        Intent dummy = new Intent(prototype.getAction());
        dummy.setType(prototype.getType());
        List<ResolveInfo> resInfo = getPackageManager().queryIntentActivities(dummy,0);

        if (!resInfo.isEmpty())
        {
            for (ResolveInfo resolveInfo : resInfo)
            {
                if (resolveInfo.activityInfo == null
                        || Arrays.asList(forbiddenChoices).contains(
                                resolveInfo.activityInfo.packageName))
                    continue;
                //Get all the posible sharers
                HashMap<String, String> info = new HashMap<String, String>();
                info.put("packageName", resolveInfo.activityInfo.packageName);
                info.put("className", resolveInfo.activityInfo.name);
                String appName = String.valueOf(resolveInfo.activityInfo                        .loadLabel(getPackageManager()));
                info.put("simpleName", appName);
                //Add only what we want
                if (Arrays.asList(nameOfAppsToShareWith).contains(
                        appName.toLowerCase()))
                {
                    intentMetaInfo.add(info);
                }
            }

            if (!intentMetaInfo.isEmpty())
            {
                // sorting for nice readability
                Collections.sort(intentMetaInfo,
                        new Comparator<HashMap<String, String>>()
                        {
                            @Override public int compare(
                                    HashMap<String, String> map,
                                    HashMap<String, String> map2)
                            {
                                return map.get("simpleName").compareTo(
                                        map2.get("simpleName"));
                            }
                        });

                // create the custom intent list
                for (HashMap<String, String> metaInfo : intentMetaInfo)
                {
                    Intent targetedShareIntent = (Intent) prototype.clone();
                    targetedShareIntent.setPackage(metaInfo.get("packageName"));
                    targetedShareIntent.setClassName(
                            metaInfo.get("packageName"),
                            metaInfo.get("className"));
                    targetedShareIntents.add(targetedShareIntent);
                }
                String shareVia = getString(R.string.offer_share_via);
                String shareTitle = shareVia.substring(0, 1).toUpperCase()
                        + shareVia.substring(1);
                chooserIntent = Intent.createChooser(targetedShareIntents                        .remove(targetedShareIntents.size() - 1), shareTitle);
                chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS,
                        targetedShareIntents.toArray(new Parcelable[] {}));
                return chooserIntent;
            }
        }

        return Intent.createChooser(prototype,
                getString(R.string.offer_share_via));
    }

它與Makibo發(fā)布的解決方案幾乎相同,但只需添加一個名稱即可輕松選擇您想要分享的應(yīng)用程序,以便在更改包名稱或類似名稱時不會有任何問題這個。只要他們不改名字。


查看完整回答
反對 回復(fù) 2019-07-26
  • 3 回答
  • 0 關(guān)注
  • 713 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號