携帯電話に最後にインストールされたアプリから共通名、パッケージ名、およびアイコンを取得できるようにするコードのセクションを作成しようとしています。現在、私が持っているのは、このソースからパッケージ名と共通名を取得する方法 (パッケージ名からアプリケーション名を取得する) ですが、これはうまくいきません。
最初のエラーは「メソッド getApplicationContext および getPackageName を解決できません」です。これらのメソッドは「BroadcastReceiver」ではなく「Activity」にネイティブであるため、これは理にかなっています (他の人がどのように機能させたかはわかりません)。
そこで、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);
}
}