2016-07-27 1 views
1

J'ai essayé d'envoyer des données entre App1 à App2 via Intent dans AndroidComment envoyer des données entre une application à une autre application dans android?

i utilisé ce code, mais je ne pouvais pas résoudre mon problème.

App1 MainActivity:

 Intent i2 = new Intent("com.appstore.MainActivity"); 
     i2.setPackage("com.appstore");//the destination packageName 
     i2.putExtra("Id", "100"); 
     startActivity(i2); 

App2 MainActivity:

Bundle data = getIntent().getExtras; 
if(data!=null){ 
    String myString = b.getString("Id"); 

} 

Manfiest App2 MainActivity:

<activity android:name=".MainActivity"> 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 
       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 

      <intent-filter> 
       <action android:name="android.intent.action.SEND" /> 
       <category android:name="android.intent.category.DEFAULT" /> 
       <data android:mimeType="image/*" /> 
      </intent-filter> 
      <intent-filter> 
       <action android:name="android.intent.action.SEND" /> 
       <category android:name="android.intent.category.DEFAULT" /> 
       <data android:mimeType="text/plain" /> 
      </intent-filter> 
      <intent-filter> 
       <action android:name="android.intent.action.SEND_MULTIPLE" /> 
       <category android:name="android.intent.category.DEFAULT" /> 
       <data android:mimeType="image/*" /> 
      </intent-filter> 

     </activity> 
+1

Faire usage de [Fournisseurs de contenu] (https://developer.android.com/guide/topics/providers/content-providers.html) pour envoyer des données entre l'application. – Arshak

+1

Le fournisseur de contenu @Arshak est probablement trop exigeant pour envoyer un 'String' d'une' Activity' à une autre. –

Répondre

0

En utilisant Bundle.putSerializable(Key,Object); et Bundle.putParcelable(Key, Object); l'ancien objet doit mettre en œuvre Serializable, et ce dernier objet doit implémenter Parcelable.

+0

comment mettre bundle Bundle.putSerializable (clé, objet); intention intérieure? – Farzad

+0

Parce que 'String' a implémenté' Serializable', 'i2.putExtra (" Id "," 100 ");' est ok. Mais, pour démarrer une activité explicite, utilisez 'i2.setClassName (" com.appstore "" com.appstore.MainActivity "); au lieu. – samm

0

Les fournisseurs de contenu:

Les fournisseurs de contenu sont l'interface standard qui relie les données en un seul processus avec le code en cours d'exécution dans un autre processus.

See Android Docs.

démonstration de travail fournisseur de contenu here.

+0

je trouve cet exemple. http://infobloggall.com/2015/04/14/communication-between-two-applications-in-android-using-messenger/ – Farzad

+0

@Farzad c'est aussi cool. –

2

Lorsque vous faites ceci:

Intent i2 = new Intent("com.appstore.MainActivity"); 
    i2.setPackage("com.appstore");//the destination packageName 
    i2.putExtra("Id", "100"); 
    startActivity(i2); 

vous appelez le constructeur unique argument de Intent. Dans ce constructeur, l'argument est interprété comme l'ACTION Intent. Vous définissez ensuite le nom du package dans le Intent.

Lorsque vous appelez startActivity() avec ce Intent, Android recherchera un Activity qui contient un <intent-filter> avec l'action spécifiée. Il n'y a pas d'applications installées qui ont un Activity défini comme celui-ci dans le manifeste:

<activity> 
    <intent-filter> 
     <action android:name="com.appstore.MainActivity"/> 
     <category android:name="android.intent.category.DEFAULT"/> 
    </intent-filter> 
</activity> 

Donc Android ne sera pas en mesure de trouver et de lancer le Activity que vous voulez.

Comme vous voulez spécifier explicitement le composant que vous souhaitez utiliser, au lieu d'utiliser le 1 argument constructeur Intent, vous devriez le faire à la place:

Intent i2 = new Intent(); 
    i2.setClassName("com.appstore", "com.appstore.MainActivity"); 
    i2.putExtra("Id", "100"); 
    startActivity(i2); 

En utilisant setClassName() vous fournissez le nom du package et la nom de classe du composant que vous voulez lancer.

+0

votre code exécute une autre application et n'envoie pas de données – Farzad

+0

Vous devez expliquer ce que vous entendez par "envoyer des données". Quelles données voulez-vous envoyer? –

2

Code final:

App 1:

Intent intent = new Intent(); 
     intent.setClassName("com.appstore", "com.appstore.MyBroadcastReceiver"); 
     intent.setAction("com.appstore.MyBroadcastReceiver"); 
     intent.putExtra("KeyName","code1id"); 
     sendBroadcast(intent); 

App 2:

Reciver: 
public class MyBroadcastReceiver extends BroadcastReceiver { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     Toast.makeText(context, "Data Received from External App", Toast.LENGTH_SHORT).show(); 

    } 
} 

Manifest:

<receiver 
      android:name=".MyBroadcastReceiver" 
      android:enabled="true" 
      android:exported="true"> 
      <intent-filter> 
       <action android:name="first_app_packagename" /> 
      </intent-filter> 
     </receiver> 

MainActivity:

MyBroadcastReceiver mReceiver = new MyBroadcastReceiver(); 
     registerReceiver(mReceiver, 
       new IntentFilter("first_app_packagename")); 
+2

Cela peut fonctionner pour vous, mais vous avez beaucoup trop de choses ici et vous ne comprenez probablement pas pourquoi votre code fonctionne. Tout d'abord, si vous avez un '' déclaré dans le manifeste, vous n'avez pas besoin de spécifier 'exportedized '" true "' car c'est la valeur par défaut, vous n'avez pas besoin de spécifier 'enabled =" true "' parce que tous les composants sont activés par défaut. Deuxièmement, si vous spécifiez un dans le manifeste, vous n'avez pas besoin d'enregistrer le 'BroadcastReceiver' en appelant' registerReceiver() '. Vous faites ** l'un ou l'autre, pas les deux **. –

+2

Troisièmement, votre déclaration '' dans le manifeste et votre utilisation de 'IntentFilter' dans' registerReceiver() 'sont inutiles, car vous n'envoyez jamais une émission' Intent' contenant l'ACTION "first_app_packagename". Quatrièmement, puisque vous définissez explicitement le paramètre COMPONENT sur l'émission 'Intent' en utilisant' setClassName() ', vous n'avez pas besoin de définir l'ACTION dans l'émission' Intent'. C'est aussi inutile. –

+1

J'ai une application où si j'appuie sur le DECLINE btn, App1 envoie des données à App2 sans problème et présente un toast. Mais ce que je dois faire est d'avoir l'intention de faire une autre activité après avoir vu un toast ... J'ai essayé de le faire dans MyBroadcastReceiver après le Toast .. mais j'ai juste des erreurs ... je ne peux pas résoudre le constructeur ... – LizG