2016-04-15 12 views
1

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); 

} 

} 

Antwort

1

I read that I can solve this error by removing the "private context" section that I added, but I need that to use getApplicationContext and getPackageName.

Nein, tun Sie nicht.

Does anyone know another way I can do this?

Verwenden Sie zuerst die Context, die in als ersten Parameter an Ihre onReceive() Methode übergeben wird. Das ermöglicht es Ihnen, diese zu ersetzen:

final PackageManager pm = mContext.getApplicationContext().getPackageManager(); 

mit diesem:

final PackageManager pm = context.getPackageManager(); 

Zweitens getPackageName(), auf eigene Faust Context genannt, gibt Ihnen Ihr Paketnamen. Sie scheinen nicht Ihren eigenen Paketnamen zu wollen. Stattdessen möchten Sie den Paketnamen der App, die installiert wurde. Um das zu bekommen, rufen Sie intent.getData().getSchemeSpecificPart(), um die Sachen nach dem package: Schema in der Uri der Intent, die ausgestrahlt wurde, zu bekommen.

Um weitere Informationen zu diesem Paket zu erhalten, können Sie es in der PackageManager nachschlagen. Rufen Sie getApplicationInfo() auf dem PackageManager an, übergeben Sie den Paketnamen. Dies wird Ihnen ein ApplicationInfo Objekt geben. Übergeben Sie das an getApplicationLabel() und getApplicationIcon() auf PackageManager, um das Etikett und das Symbol zu erhalten.

+0

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

+0

@Natalie: Um, zeichne es auf ein 'Bitmap'-backed' Canvas', denke ich. – CommonsWare