Получение имени пакета, общего имени и значка из приложения LAST INSTALLED с использованием BroadcastReceiver
Я пытаюсь написать фрагмент кода, который позволит мне получить общее имя, имя пакета и значок из последнего установленного приложения на моем телефоне. В настоящее время у меня есть, как получить имя пакета и общее имя из этого источника ( получить имя приложения из имени пакета), но это не работает для меня.
Первая ошибка - "Не удается разрешить метод getApplicationContext и getPackageName". Это имеет смысл, потому что эти методы являются родными для "Activity", а не "BroadcastReceiver" (я не знаю, как другой человек заставил его работать).
Затем я создал частный контекст, чтобы я мог использовать getApplicationContext и getPackageName. Мой код теперь выглядит так, как я написал ниже, сборка gradle, но мое приложение вылетает, когда я устанавливаю другое приложение на телефон с ошибкой:
can't instantiate class com.example.natalievold.applistener.NewInstallReceiver; no empty constructor
Я прочитал, что могу решить эту ошибку, удалив добавленный раздел "частный контекст", но мне нужно использовать getApplicationContext и getPackageName. Кто-нибудь знает, как я могу это сделать? Я также не уверен, как получить значок последнего установленного приложения.
public class NewInstallReceiver extends BroadcastReceiver
{
private Context mContext;
public NewInstallReceiver(Context context) {
mContext = context;
}
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
String action = intent.getAction();
if(action.equals("android.intent.action.PACKAGE_ADDED")) {
Logger.getLogger("DATA:" + intent.getData().toString());
}
if(action.equals("android.intent.action.PACKAGE_REMOVED")){
Logger.getLogger("DATA:" + intent.getData().toString());
}
if(action.equals("android.intent.action.PACKAGE_REPLACED")){
Logger.getLogger("DATA:" + intent.getData().toString());
}
final PackageManager pm = mContext.getApplicationContext().getPackageManager();
ApplicationInfo ai;
try {
ai = pm.getApplicationInfo( this.mContext.getPackageName(), 0);
} catch (final PackageManager.NameNotFoundException e) {
ai = null;
}
final String applicationName = (String) (ai != null ? pm.getApplicationLabel(ai) : "(unknown)");
}
}
Мой Манифест:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.natalievold.applistener">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<receiver android:name="com.example.natalievold.applistener.NewInstallReceiver">
<intent-filter android:priority="100">
<action
android:name="android.intent.action.PACKAGE_INSTALL"/>
<action
android:name="android.intent.action.PACKAGE_ADDED"/>
<action
android:name="android.intent.action.PACKAGE_DATA_CLEARED"/>
<action
android:name="android.intent.action.PACKAGE_REMOVED"/>
<data android:scheme="package"/>
</intent-filter>
</receiver>
<activity
android:name=".MainActivity"
android:label="@string/app_name"
android:theme="@style/AppTheme.NoActionBar">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
ЗДЕСЬ ЗАКЛЮЧИТЕЛЬНЫЙ КОД, КОТОРЫЙ Я ДОЛЖЕН РАБОТАТЬ! (это только часть для установки приложения, а не для удаления). И я ничего не изменил в манифесте.
public class NewInstallReceiver extends BroadcastReceiver
{
@Override
public void onReceive(Context context, Intent intent) {
Log.d("NewInstallReceiver", "Intent: " + intent.getAction());
final PackageManager pm = context.getPackageManager();
ApplicationInfo ai;
try {
ai = pm.getApplicationInfo( intent.getData().getSchemeSpecificPart(), 0);
Log.d("PACKAGE NAME","Intent" + ai);
} catch (final PackageManager.NameNotFoundException e) {
ai = null;
}
final String applicationName = (String) (ai != null ? pm.getApplicationLabel(ai) : "(unknown)");
Log.d("Application NAME", "Intent: " + applicationName);
Drawable icon = context.getPackageManager().getApplicationIcon(ai);
Log.d("Application ICON", "Intent: " + icon);
}
}
1 ответ
Я прочитал, что могу решить эту ошибку, удалив добавленный раздел "частный контекст", но мне нужно использовать getApplicationContext и getPackageName.
Нет, ты не.
Кто-нибудь знает, как я могу это сделать?
Во-первых, используйте Context
который передается в качестве первого параметра вашему onReceive()
метод. Это позволит вам заменить это:
final PackageManager pm = mContext.getApplicationContext().getPackageManager();
с этим:
final PackageManager pm = context.getPackageManager();
Во-вторых, getPackageName()
позвонил по своему усмотрению Context
, дает вам имя вашего пакета. Похоже, вы не хотите, чтобы ваше собственное имя пакета. Вместо этого вы хотите имя пакета приложения, которое было установлено. Чтобы получить это, позвоните intent.getData().getSchemeSpecificPart()
, чтобы получить материал после package:
схема в Uri
из Intent
это было передано.
Затем, чтобы получить другую информацию об этом пакете, вы можете посмотреть его в PackageManager
, Вызов getApplicationInfo()
на PackageManager
, передавая имя пакета. Это даст вам ApplicationInfo
объект. Передайте это getApplicationLabel()
а также getApplicationIcon()
на PackageManager
чтобы получить метку и значок соответственно.