Получение имени пакета, общего имени и значка из приложения 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 чтобы получить метку и значок соответственно.

Другие вопросы по тегам