Umgang mit impliziter Absicht zukünftige Abwertung in Lollipop

Um Daten an andere Anwendungen zu übermitteln, habe ich implizite Intents wie in den folgenden Beispielen verwendet:

Intent intent = new Intent(); intent.setAction("com.example.OpenURL"); intent.putExtra("URL_TO_OPEN", url_string); sendOrderedBroadcastAsUser(intent); Intent intent = new Intent(); intent.setAction("com.example.CreateUser"); intent.putExtra("Username", uname_string); intent.putExtra("Password", pw_string); sendBroadcast(intent); Intent intent = new Intent(); intent.setAction("com.example.BackupUserData"); intent.setData(file_uri); intent.addFlags(FLAG_GRANT_READ_URI_PERMISSION); sendBroadcast(intent); 

Aber dieses Verhalten wird nicht mehr in Android 5.0 empfohlen

  • Android SharedPreferences String Set - einige Elemente werden nach dem App-Neustart entfernt
  • Android - Vergrößern Sie den linken Rand mit Animation
  • SQLiteDiskIOException in Android
  • Kann ich den Spracherkenner auf unbestimmte Zeit hören?
  • Android Emulator Shutdown nimmt für immer
  • So beschränke ich den EditText, um nur alphanumerische Zeichen zu akzeptieren
  • Http://developer.android.com/about/versions/android-5.0-changes.html

    Bindung an einen Service

    Die Context.bindService () – Methode erfordert jetzt eine explizite Absicht und wirft eine Ausnahme aus, wenn sie eine implizite Absicht gegeben hat. Um sicherzustellen, dass Ihre App sicher ist, verwenden Sie eine ausdrückliche Absicht, wenn Sie Ihren Service starten oder binden, und deklarieren Sie keine Absichtsfilter für den Dienst.

    Von Android Quellcode genauer "ContextImpl" Klasse:

     private void validateServiceIntent(Intent service) { if (service.getComponent() == null && service.getPackage() == null) { if (getApplicationInfo().targetSdkVersion >= Build.VERSION_CODES.LOLLIPOP) { IllegalArgumentException ex = new IllegalArgumentException( "Service Intent must be explicit: " + service); throw ex; } else { Log.w(TAG, "Implicit intents with startService are not safe: " + service + " " + Debug.getCallers(2, 3)); } } } 

    Wie kann ich damit umgehen?

  • Android imeOptions = "actionDone" funktioniert nicht
  • Eclipse wirft java.lang.NullPointerException auf die Erstellung von Android-Junit-Test-Konfiguration
  • Wie man einen Dateipfad übergibt, der im Assets-Ordner zu File (String-Pfad) ist?
  • Klonen Sie Textansicht, um es an eine ViewGroup anzuhängen
  • Erkennung der Home-Taste in Android drücken
  • Wie gehen Sie mit LicenseCheckerCallback.ERROR_NOT_MARKET_MANAGED Fehlercode um?
  • 3 Solutions collect form web for “Umgang mit impliziter Absicht zukünftige Abwertung in Lollipop”

    Ja, wenn man in einem Gerät mit Android 5.0 läuft, wird dieser Code entweder eine Warnung targetSdkVersion (wenn dein App's targetSdkVersion <21 ist) oder einen Unfall (wenn Targeting Lollipop selbst). Überprüfen Sie den Quellcode für validateServiceIntent() in ContextImpl.java :

    Dieser Code ist gefährlich, da es einem böswilligen Empfänger erlauben könnte, sich selbst zu registrieren und diese Anrufe abzufangen (oder zu verändern).

    Die sinnvollste Alternative ist wahrscheinlich, den Paketnamen der App anzugeben, die Sie anrufen möchten, indem Sie Intent.setPackage() . Auf diese Weise ist die Absicht nicht mehr implizit, und es wird funktionieren. Beispielsweise:

      intent.setPackage("com.example.app"); 

    Natürlich, wenn der Empfänger in deiner App ist, gibt es einfachere Alternativen (aber das scheint nicht der Fall zu sein, aus deiner Beschreibung des Problems).

    Wie in anderen Kommentaren und Antworten gesagt, ist die Änderung nur für bindService relevant und nicht sendBroadcast , also wenn das der Fall ist (wie in deinem Beispielcode) – du brauchst nichts zu ändern.

    Wenn Sie bindService , ist der Weg, eine implizite Absicht zu einer expliziten Absicht zu machen, einen ComponentName und ihn mit der setComponent oder setClass Methode auf den Service Intent zu setClass .

    Aus der Intent :

    Absichtsauflösung

    Es gibt zwei primäre Formen der Absicht, die Sie verwenden werden.

    Explizite Intents haben eine Komponente angegeben (über setComponent (ComponentName) oder setClass (Context, Class)), die die exakte Klasse liefert. Oft werden diese nicht alle anderen Informationen enthalten, einfach ein Weg für eine Anwendung, um verschiedene interne Aktivitäten zu starten, die es hat, während der Benutzer mit der Anwendung interagiert. Implizite Absicht haben keine Komponente angegeben. Stattdessen müssen sie genügend Informationen für das System enthalten, um festzustellen, welche der verfügbaren Komponenten am besten für diese Absicht laufen soll.

    Wie @Commonsware in seinem Blog darauf hingewiesen hat, sind die 3 Möglichkeiten, dies zu lösen:

    1. resolveService ()

     Intent i = new Intent("serviceName"); ResolveInfo info = ctx.getPackageManager().resolveService(i, Context.BIND_AUTO_CREATE); i.setComponent(new ComponentName(info.serviceInfo.packageName,info.serviceInfo.name)); 

    Und benutze die Absicht, den Dienst zu binden.

    2. queryIntentServices ()

     Intent i = new Intent("serviceName"); List<ResolveInfo> infos = ctx.getPackageManager().queryIntentServices(i,Context.BIND_AUTO_CREATE); if (infos.isEmpty()) { throw new IllegalStateException("no service found"); } if (infos.size() > 1) { throw new SecurityException("multiple services found, could be a security issue"); } i.setComponent(new ComponentName(infos.get(0).serviceInfo.packageName, infos.get(0).serviceInfo.name)); 

    Wenn die Abfrage mehr als eine Info zurückgibt, könnte dies bedeuten, dass eine ärgerliche Dienstleistung zuhört.

    3. setPackage ()

    Wenn du den Paketnamen hast, kannst du einfach den Paketnamen setzen, wie @matiash in seinem Beitrag sagte:

     Intent i = new Intent(MyClass.class.getName()); i.setPackage(MyClass.class.getPackage().getName()) 
    Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.