Android?獲取手機(jī)已安裝的應(yīng)用列表實(shí)現(xiàn)詳解
1、掃描已安裝的應(yīng)用列表
var queryIntentActivities = mutableListOf<ResolveInfo>() val intent = Intent(Intent.ACTION_MAIN).addCategory(Intent.CATEGORY_LAUNCHER) if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) { queryIntentActivities = packageManager.queryIntentActivities(intent, PackageManager.MATCH_ALL) } else { queryIntentActivities = packageManager.queryIntentActivities(intent, 0) }
上面代碼中,queryIntentActivities 就是獲取的應(yīng)用列表數(shù)據(jù)
遍歷獲取每個(gè)應(yīng)用的信息
下面就直接通過遍歷獲取每個(gè)應(yīng)用的信息了
queryIntentActivities.forEach { bean = AppInfoBean( icon = it.loadIcon(packageManager), appName = it.loadLabel(packageManager).toString(), appPackageName = it.activityInfo.applicationInfo.packageName ) appBeanList.add(bean!!) }
上面 AppInfoBean 是自己定義的實(shí)體bean 里面有應(yīng)用的名稱,包名,還有Drawable 類型的應(yīng)用icon
appBeanList 是定義的list變量,
注意:這里提個(gè)醒,也是我遇到的一個(gè)小問題,在掃描所有應(yīng)用的時(shí)候,Intent的action 是:Intent.ACTION_MAIN 切記,否則一個(gè)也查不到,
添加權(quán)限
還有,可能你通過上面獲取的應(yīng)用列表只有幾個(gè),不全,此時(shí),你需要添加一個(gè)權(quán)限:
<uses-permission android:name="android.permission.QUERY_ALL_PACKAGES" tools:ignore="QueryAllPackagesPermission" />
有了上面這個(gè)權(quán)限,你才能獲取到所有的應(yīng)用
通過包名查詢對(duì)應(yīng)應(yīng)用的圖標(biāo)icon
/** * 根據(jù)應(yīng)用包名,查應(yīng)用的icon圖 */ private fun loadAppIconByPackageName(packageName:String,listener:(icon:Drawable) -> Unit){ try { if (packageManager == null){ packageManager = BaseApp.myApp.packageManager } val packageInfo = packageManager?.getPackageInfo( packageName, PackageManager.GET_ACTIVITIES ) packageInfo?.applicationInfo?.loadIcon(packageManager)?.let { listener.invoke(it) } } catch (e: Exception) { listener.invoke(BaseApp.myApp.resources.getDrawable(R.mipmap.ic_launcher)) } }
這個(gè)就簡(jiǎn)單了,獲取當(dāng)前的packageManager 就可以進(jìn)行獲取對(duì)應(yīng)的icon了,不過這個(gè)跟上面獲取應(yīng)用一樣,也需要權(quán)限和否則可能也會(huì)遇到掃描不到的問題哦。
通過包名獲取對(duì)應(yīng)應(yīng)用的啟動(dòng)頁的全類名
/** * 通過包名獲取app的入口activity */ @SuppressLint("WrongConstant") fun getAppEnter(context: Context, packageName: String): String { var mainAct = "" try { val intent = Intent().apply { action = Intent.ACTION_MAIN addCategory(Intent.CATEGORY_LAUNCHER) } val list = context.packageManager.queryIntentActivities(intent, PackageManager.GET_ACTIVITIES) list.forEach { if (TextUtils.equals(it.activityInfo.packageName, packageName)) { mainAct = it.activityInfo.name } } } catch (ex: Exception) { } finally { return mainAct } }
這個(gè)需要注意的事項(xiàng)和第一個(gè)獲取應(yīng)用列表一樣,其他的都沒什么需要注意的了。
以上就是Android 獲取手機(jī)已安裝的應(yīng)用列表實(shí)現(xiàn)詳解的詳細(xì)內(nèi)容,更多關(guān)于Android 獲取應(yīng)用列表的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Android檢測(cè)Activity或者Service是否運(yùn)行的方法
下面小編就為大家分享一篇Android檢測(cè)Activity或者Service是否運(yùn)行的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-03-03Android中解決頁簽手指按下從左到右滑動(dòng)的bug
有一種方法可以阻止父層的View截獲touch事件,就是調(diào)用 getParent().requestDisallowInterceptTouchEvent(true);方法。這篇文章給大家介紹了Android中解決頁簽手指按下從左到右滑動(dòng)的bug,一起看看吧2016-10-10flutter PageView實(shí)現(xiàn)左右滑動(dòng)切換視圖
這篇文章主要為大家詳細(xì)介紹了flutter PageView實(shí)現(xiàn)左右滑動(dòng)切換視圖,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-07-07Android Studio 設(shè)置代碼提示和代碼自動(dòng)補(bǔ)全快捷鍵方式
這篇文章主要介紹了Android Studio 設(shè)置代碼提示和代碼自動(dòng)補(bǔ)全快捷鍵方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-03-03Android使用AudioRecord實(shí)現(xiàn)錄音功能
這篇文章主要為大家詳細(xì)介紹了Android使用AudioRecord實(shí)現(xiàn)錄音功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-08-08Android開發(fā) -- 控件的顯示與隱藏 setVisibility View.VISIBLE View.INVISI
本文簡(jiǎn)單介紹在Android開發(fā)中控件的顯示與隱藏幾種常見的屬性,給大家一個(gè)參考,希望對(duì)大家學(xué)習(xí)有所幫助。2016-06-06Jsoup 抓取頁面的數(shù)據(jù)實(shí)例詳解
這篇文章主要介紹了Jsoup 抓取頁面的數(shù)據(jù)實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下2016-12-12