2016-03-21 9 views
-2

Ich habe eine Activity A, die von Application1 und Application2 aufgerufen werden kann, in meiner Anwendung.Ist es möglich, den Paketnamen der Anrufer-App von Activities bei der Interprozesskommunikation zu erhalten?

die Config von AcitivityA in der Manifest Datei unter:

<activity 
    android :name=".activity.ActivityA" 
    android :exported="true" 
    android :screenOrientation="portrait"/> 

Wie Application1 und Application2 Anruf ActivityA:

PackageManager packageManager = getPackageManager(); 
Intent intent = new Intent(); 
intent.setClassName(“com.abc.test", “com.abc.test.activity.ActivityA"); 
List activities = packageManager.queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY); 
if (activities.size() > 0) { 
    startActivity(intent); 
} 

Zur Sicherheit habe ich eine weiße Liste enthält Application1 und Application2 hinzufügen möchten Der Paketname in ActivityA, der nur geöffnet werden kann, wenn der Paketname des Anrufers ActivityA's in der Whitelist steht.

So ist es möglich, den Paketnamen Activities Anrufer-App in ActivityA zu bekommen?

EDITED:

wenn unmöglich, ohne zusätzliche Daten in Intent Jede andere Idee Activity A Sicherheit zu halten?

Antwort

0

Solange der Anrufer keine Informationen in einem extra über sich bereitstellt, ist die Antwort Nein.

Wenn Sie nur bestimmte Anrufer dürfen sichern möchten, verwenden Sie Berechtigungen. Siehe

Wenn Sie alle Anrufer besitzen, dann würde ich das alles mit dem gleichen Schlüssel zu unterzeichnen empfehlen und eine Genehmigung mit protectionLevelSignature verwenden.

Eine andere Methode, die mehr Code erfordert, ist Dienste für die Kommunikation.

Zitat aus dem ersten Link:

Mit Binder oder Messenger ist der bevorzugte Mechanismus für IPC RPC-Stil in Android. Sie bieten eine klar definierte Schnittstelle, die bei Bedarf eine gegenseitige Authentifizierung der Endpunkte ermöglicht.

+0

Ich besitze nicht alle Anrufer, daher kann ich keine Berechtigung mit protectionLevel Signature verwenden. Wenn ich die Berechtigung mit "normal" verwende, können andere Apps ihr Manifest so ändern, dass sie dieselbe Berechtigung verwenden. – Xiaozou

+0

siehe Bearbeiten: Haben Sie die Verwendung von Bindern in Betracht gezogen? – F43nd1r

+0

Nein, es ist ein wenig kompliziert. – Xiaozou

0

Was ich mache, ist die Anrufaktivität über die Absicht zu übergeben.

zB
public class MainActivity extends AppCompatActivity { 
    private final static String THIS_ACTIVITY = "MainActivity"; 
......... 

    Intent intent = new Intent(this, ShopAddActivity.class); 
    intent.putExtra("Caller",THIS_ACTIVITY); 
    startActivity(intent); 

und in einer anderen Aktivität (Aufruf gleiches Kind Aktivität): -

public class ShopListByCursorActivity extends AppCompatActivity { 

    private final static String THIS_ACTIVITY = "ShopListByCursorActivity"; 

....... 

    Intent intent = new Intent(findViewById(R.id.aslbclv01).getContext(), ShopAddActivity.class); 
    intent.putExtra("Caller", THIS_ACTIVITY + "Update"); 
    startActivity(intent); 

Und dann in der gerufenen Aktivität (als ein Beispiel für den Anrufer Erkennung)

if(getIntent().getStringExtra("Caller").equals("ShopListByCursorActivityUpdate")) { 

     DO STUFF HERE 
     } 
+0

Nicht sicher über den Sicherheitsaspekt, so dass dies möglicherweise nicht sicher genug ist. Ein Vorteil ist jedoch, dass mit dieser Methode ein Abschnitt innerhalb einer Aktivität als Aufrufer erkannt werden kann. Im obigen Beispiel. Ich habe ** Update ** an THIS_ACTIVITY angefügt, um anzuzeigen, dass der Anrufer den Aktualisierungsmodus anstelle des Hinzufügen-Modus verlangt. – MikeT

+1

Sicherheit ist ziemlich niedrig. Ich meine, ein Nicht-Whitelist-Anrufer muss nur einen Namen auf der weißen Liste der Anrufer wissen, und er kann so tun, als sei er der Anrufer. Dies ist jedoch nett, wenn Sie verschiedene Dinge für verschiedene Anrufer tun möchten. – F43nd1r

+0

Der angehängte Wert könnte ein Sicherheitscode sein. – MikeT

1

Try getCallingPackage() und getCallingActivity() Methoden von Activity.

+0

Direkt aus der Dokumentation: 'Hinweis: Wenn die aufrufende Aktivität kein Ergebnis erwartet (dh nicht das Formular startActivityForResult (Intent, int) verwendet hat, das einen Anforderungscode enthält), ist das aufrufende Paket null.' – F43nd1r