Как я могу определить разрешение на запуск приложений программно в Android?
Я хочу видеть разрешение запуска приложений Android в моем программном обеспечении.
По этой причине у меня есть следующий код:
List<App> apps = new ArrayList<App>();
ActivityManager am = (ActivityManager)this.getSystemService(ACTIVITY_SERVICE);
PackageManager packageManager = getPackageManager();
List<RunningAppProcessInfo> l = am.getRunningAppProcesses();
Iterator<RunningAppProcessInfo> i = l.iterator();
PackageManager pm = this.getPackageManager();
int row_count = 0 ;
while(i.hasNext()) {
ActivityManager.RunningAppProcessInfo info = (ActivityManager.RunningAppProcessInfo)(i.next());
try
{
CharSequence c = pm.getApplicationLabel(pm.getApplicationInfo(info.processName, PackageManager.GET_META_DATA));
App app = new App();
app.setTitle(c.toString());
app.setPackageName(l.get(row_count).processName);
PackageInfo packageInfo = packageManager.getPackageInfo(l.get(row_count).processName, PackageManager.GET_PERMISSIONS);
String[] reqPermission= packageInfo.requestedPermissions;
app.set_Permission_Info(reqPermission);
// app.setVersionName(p.versionName);
// app.setVersionCode(p.versionCode);
// CharSequence description = p.applicationInfo.loadDescription(packageManager);
// app.setDescription(description != null ? description.toString() : "");
row_count++;
// app.setSize(p.s)
apps.add(app);
}
catch(Exception e){}
Но есть проблема.
Когда я запускаю свои приложения, я обнаруживаю, что имя приложения и имя пакета приложения не согласованы. Почему эта проблема возникла?
Основная проблема описана следующим образом:
Предположим, на моем устройстве запущены приложения с именем "EBOOK_Reader" и "Камера". Имя пакета - "com.ab" и "com.cd" соответственно. Проблема этого кода в том, что имя соответствующего пакета не соответствует имени соответствующего приложения.
Он показывает имя пакета "com.ab" для "Camera" и "com.cd" для "EBOOK_Reader", что нежелательно.
Есть идеи, как решить проблему? Благодарю вас
3 ответа
Имя приложения и имя пакета приложения обычно различаются. Вам лучше использовать имя пакета, поскольку оно уникально для всего устройства.
Обновление: теперь я понимаю вашу проблему. Спасибо за разъяснения. Это из-за переменной row_count
, В основном вы используете две разные переменные итератора. Вот почему вы получаете 2 разных результата. Вам не нужно row_count
потому что у вас уже есть интегратор для i
, Попробуйте обновленный код ниже:
В принципе l.get(row_count).processName
был заменен info.processName
,
List<App> apps = new ArrayList<App>();
ActivityManager am = (ActivityManager)this.getSystemService(ACTIVITY_SERVICE);
PackageManager packageManager = getPackageManager();
List<RunningAppProcessInfo> l = am.getRunningAppProcesses();
Iterator<RunningAppProcessInfo> i = l.iterator();
PackageManager pm = this.getPackageManager();
// int row_count = 0 ; // no need for this. feel free to delete
while(i.hasNext()) {
ActivityManager.RunningAppProcessInfo info = (ActivityManager.RunningAppProcessInfo)(i.next());
try
{
CharSequence c = pm.getApplicationLabel(pm.getApplicationInfo(info.processName, PackageManager.GET_META_DATA));
App app = new App();
app.setTitle(c.toString());
app.setPackageName(info.processName);
PackageInfo packageInfo = packageManager.getPackageInfo(info.processName, PackageManager.GET_PERMISSIONS);
String[] reqPermission= packageInfo.requestedPermissions;
app.set_Permission_Info(reqPermission);
// app.setVersionName(p.versionName);
// app.setVersionCode(p.versionCode);
// CharSequence description = p.applicationInfo.loadDescription(packageManager);
// app.setDescription(description != null ? description.toString() : "");
//row_count++; // no need for this. feel free to delete
// app.setSize(p.s)
apps.add(app);
}
catch(Exception e){}
Это правильно и работает:
PackageManager mPm = getPackageManager();
List <PackageInfo> appList=mPm.getInstalledPackages(PackageManager.GET_PERMISSIONS|PackageManager.GET_RECEIVERS|
PackageManager.GET_SERVICES|PackageManager.GET_PROVIDERS);
for (PackageInfo pi : appList) {
System.out.println("Process Name: "+pi);
// Do not add System Packages
if ((pi.requestedPermissions == null || pi.packageName.equals("android")) ||
(pi.applicationInfo != null && (pi.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0))
continue;
for (String permission : pi.requestedPermissions) {
//Map<String, String> curChildMap = new HashMap<String, String>();
//System.out.println("############ "+permission);
try {
PermissionInfo pinfo = mPm.getPermissionInfo(permission, PackageManager.GET_META_DATA);
CharSequence label = pinfo.loadLabel(mPm);
CharSequence desc = pinfo.loadDescription(mPm);
System.out.println("$$$$$ "+label+"!!!!!! "+desc);
} catch (NameNotFoundException e) {
Log.i(TAG, "Ignoring unknown permission " + permission);
continue;
}
}
}
Имена процессов не привязаны к имени пакета приложения. По умолчанию они совпадают, для удобства. Тем не менее, каждое приложение может изменить свое имя процесса в манифесте, используя android:process
атрибут, или порождать больше процессов с разными именами для различных компонентов.
И в еще более сложных сценариях несколько приложений могут совместно использовать один и тот же процесс.
В частности, это означает, что вы не можете использовать имя процесса, чтобы получить приложения, которые работают в данный момент. Вместо этого вы должны перебрать список пакетов, загруженных в этот процесс, используя RunningAppProcessInfo.pkgList
поле вместо Помните, что это массив, который может содержать более одного имени пакета приложения. (См. Примечание о расширенных сценариях выше)
На отдельном примечании, в качестве документации для getRunningAppProcesses()
состояния:
Примечание. Этот метод предназначен только для отладки или создания пользовательского интерфейса управления процессами.