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)用的信息
下面就直接通過(guò)遍歷獲取每個(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è)小問(wèn)題,在掃描所有應(yīng)用的時(shí)候,Intent的action 是:Intent.ACTION_MAIN 切記,否則一個(gè)也查不到,
添加權(quán)限
還有,可能你通過(guò)上面獲取的應(yīng)用列表只有幾個(gè),不全,此時(shí),你需要添加一個(gè)權(quán)限:
<uses-permission
android:name="android.permission.QUERY_ALL_PACKAGES"
tools:ignore="QueryAllPackagesPermission" />有了上面這個(gè)權(quán)限,你才能獲取到所有的應(yīng)用
通過(guò)包名查詢對(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了,不過(guò)這個(gè)跟上面獲取應(yīng)用一樣,也需要權(quán)限和否則可能也會(huì)遇到掃描不到的問(wèn)題哦。
通過(guò)包名獲取對(duì)應(yīng)應(yīng)用的啟動(dòng)頁(yè)的全類名
/**
* 通過(guò)包名獲取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)用列表一樣,其他的都沒(méi)什么需要注意的了。
以上就是Android 獲取手機(jī)已安裝的應(yīng)用列表實(shí)現(xiàn)詳解的詳細(xì)內(nèi)容,更多關(guān)于Android 獲取應(yīng)用列表的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Android實(shí)現(xiàn)圖片文字識(shí)別
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)圖片文字識(shí)別,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-07-07
Android實(shí)現(xiàn)閱讀進(jìn)度記憶功能
這篇文章主要介紹了Android實(shí)現(xiàn)閱讀進(jìn)度記憶功能,Android控件WebView實(shí)現(xiàn)保存閱讀進(jìn)度,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-10-10
android實(shí)現(xiàn)session保持簡(jiǎn)要概述及實(shí)現(xiàn)
其實(shí)sesion在瀏覽器和web服務(wù)器直接是通過(guò)一個(gè)叫做name為sessionid的cookie來(lái)傳遞的,所以只要在每次數(shù)據(jù)請(qǐng)求時(shí)保持sessionid是同一個(gè)不變就可以用到web的session了,感興趣的你可以參考下本文或許對(duì)你有所幫助2013-03-03
Android中使用ListView實(shí)現(xiàn)漂亮的表格效果
這篇文章主要介紹了Android中使用ListView實(shí)現(xiàn)漂亮的表格效果,本文用詳細(xì)的代碼實(shí)例創(chuàng)建了一個(gè)股票行情表格,需要的朋友可以參考下2014-10-10
Android使用ContentResolver搜索手機(jī)通訊錄的方法
這篇文章主要介紹了Android使用ContentResolver搜索手機(jī)通訊錄的方法,結(jié)合實(shí)例形式分析了Android中ContentResolver操作手機(jī)通訊錄的具體步驟與相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2016-01-01
Android自定義View實(shí)現(xiàn)公交成軌跡圖
這篇文章主要為大家詳細(xì)介紹了Android自定義View實(shí)現(xiàn)公交成軌跡圖,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-06-06
Android View事件分發(fā)和消費(fèi)源碼簡(jiǎn)單理解
這篇文章主要介紹了Android View事件分發(fā)和消費(fèi)源碼簡(jiǎn)單理解的相關(guān)資料,需要的朋友可以參考下2017-07-07
Android實(shí)現(xiàn)漂亮的Gallery畫廊
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)漂亮的Gallery畫廊,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-05-05

