根據(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í)行的操作。
編輯:這很容易找到。只需檢查ChooserActivity和ResolverActivity源代碼即可。這些課程相當(dāng)小。

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)用程序,以便在更改包名稱或類似名稱時不會有任何問題這個。只要他們不改名字。
- 3 回答
- 0 關(guān)注
- 713 瀏覽
添加回答
舉報
0/150
提交
取消