实习笔记-10

读取软件

  • 声明权限
1
2
3
4
5
6
7
8
9
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
<!-- 对于安卓11开始 -->
<uses-permission android:name="android.permission.QUERY_ALL_PACKAGES"
tools:ignore="QueryAllPackagesPermission" />
<queries>
<intent>
<action android:name="android.intent.action.MAIN" />
</intent>
</queries>
1
2
3
4
5
val pm = context.applicationContext.packageManager
val installedApplications = pm.getInstalledApplications(0)
installedApplications.forEach {info ->
//handle info
}
  • 该操作比较耗时,在新线程或协程job中执行

获取应用Label(应用名) , 应用图标和应用安装时间

1
2
3
info.loadIcon(pm)
pm.getApplicationLabel(info)
pm.getPackageInfo(name, 0).firstInstallTime

卸载软件

  • 发送intent
1
2
3
4
val intent = Intent(Intent.ACTION_DELETE)
intent.data = Uri.parse("package:$packageName")
intent.putExtra(Intent.EXTRA_RETURN_RESULT, true)
mStartActivity.launch(intent)
  • 注册StartActivityForResult
1
2
3
4
5
6
private val mStartActivity =
registerForActivityResult(ActivityResultContracts.StartActivityForResult()) {
val adapter =
binding.rvSearchResult.adapter as AppsAdapter
adapter.deletionResult(it != null && it.resultCode == Activity.RESULT_OK)
}

ActivityResultContract

1
2
3
4
5
6
7
8
9
10
11
12
13
//第一步,注册交互数据回调监听
val contact = registerForActivityResult(ActivityResultContracts.PickContact()) { uri : Uri? ->
//如果Uri为null,说明用户没有操作直接返回,这里代码会在下面补贴出来,因为涉及跨进程交互,代码比较长,不想贴这里影响阅读效率
……
}

//第二步,intent,和原来一样
xxx.setOnClickListener {
val intent = Intent(Intent.ACTION_PICK)
intent.addCategory(Intent.CATEGORY_DEFAULT)
intent.setType("vnd.android.cursor.dir/phone_v2")
contact.launch(intent)
}
作者

Meow Meow Liu

发布于

2022-03-22

更新于

2024-04-23

许可协议

评论