Ich versuche, einen Codeabschnitt zu schreiben, der es mir ermöglicht, den allgemeinen Namen, den Paketnamen und das Symbol von der zuletzt installierten App auf meiner Telefon. Derzeit habe ich, wie man den Paketnamen und den allgemeinen Namen von dieser Quelle erhält (get application name from package name), aber das funktioniert nicht für mich.Abrufen des Paketnamens, des allgemeinen Namens und des Symbols von der LAST INSTALLED-App mit BroadcastReceiver
Der erste Fehler ist "Kann Methode getApplicationContext und getPackageName nicht auflösen". Dies ist sinnvoll, weil diese Methoden nativ für "Activity" und nicht für "BroadcastReceiver" sind (ich weiß nicht, wie die andere Person es zur Arbeit brachte).
Also dann habe ich einen privaten Kontext erstellt, so dass ich getApplicationContext und getPackageName verwenden konnte. Mein Code sieht nun, was ich unten geschrieben habe, die gradle baut, aber meine App stürzt ab, wenn ich installiere eine andere App auf meinem Handy mit dem Fehler:
can't instantiate class com.example.natalievold.applistener.NewInstallReceiver; no empty constructor
ich gelesen, dass ich diesen Fehler durch Entfernen lösen kann " Privater Kontext "Abschnitt, den ich hinzugefügt habe, aber ich brauche das, um getApplicationContext und getPackageName zu verwenden. Weiß jemand einen anderen Weg, wie ich das machen kann? Ich bin mir auch nicht sicher, wie ich das Icon der zuletzt installierten App finden soll.
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)");
}
}
Mein Manifest:
<?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>
Dies ist die finale Code arbeite ich GOT! (Dies ist nur der Teil für das Installieren einer App, nicht das Deinstallieren). Und ich habe an dem Manifest nichts geändert.
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);
}
}
Vielen Dank für die Hilfe! Für die getApplicationIcon() habe ich versucht, die Symbol-PNG-Datei oder eine andere Bilddatei zu bekommen. Wenn ich die getApplicationIcon-Methode verwende, bekomme ich "[email protected]". Gibt es eine Möglichkeit, damit ich eine Image-Datei bekommen kann? – Natalie
@Natalie: Um, zeichne es auf ein 'Bitmap'-backed' Canvas', denke ich. – CommonsWare