2012-09-06 74 views
8

He intentado obtener dos actividades en dos aplicaciones separadas para comunicar utilizando una acción personalizada y una intención implícita.Acciones personalizadas usando intenciones implícitas entre aplicaciones

La primera aplicación (servidor), tiene la siguiente manifiesto:

<application android:icon="@drawable/ic_launcher" 
    android:label="@string/app_name" android:theme="@style/AppTheme"> 
    <activity android:name="edu.example.sharing.manager.SecureFileShare" 
     android:label="@string/title_activity_secure_file_share" android:exported="true"> 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 
      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
     <intent-filter> 
      <action android:name="edu.example.sharing.action.STORE" /> 
      <category android:name="android.intent.category.DEFAULT" /> 
      <data android:mimeType="*/*" /> 
     </intent-filter> 
    </activity> 
</application> 

La segunda aplicación crea una intención de la siguiente manera:

File f = new File(s); 
Uri fileUri = Uri.fromFile(f); 
Intent intent = new Intent(); 
intent.setData(fileUri); 
intent.setAction("edu.example.sharing.action.STORE");    
startActivityForResult(intent, STORE_REQUEST); 

Su manifiesto es normal. Cuando intento enviar la intención en la aplicación cliente, sin embargo, me sale una actividad que no se encuentra una excepción:

FATAL EXCEPTION: main 
android.content.ActivityNotFoundException: No Activity found to handle Intent {act=edu.example.sharing.action.STORE dat=file:///storage/sdcard0/Download/Alarcon12-Rigoberto.pdf } 
at android.app.Instrumentation.checkStartActivityResult(Instrumentation.java:1545) 
at android.app.Instrumentation.execStartActivity(Instrumentation.java:1416) 
at android.app.Activity.startActivityForResult(Activity.java:3351) 
at android.app.Activity.startActivityForResult(Activity.java:3312) 

¿Qué está causando Android para no reconocer la actividad declarada en la segunda aplicación? Gracias.

+0

intente poner un atributo exportado a la actividad 'FileStore' en el manifiesto. – Varun

+0

también para mí a veces no funciona cuando estaba configurando la acción usando 'setAction()', pero luego cambié a usar el constructor 'Intent' para establecer la acción, ej:' new Intent ("edu.example, manager. action.STORE ");' – Varun

+0

Intenta cambiar tu acción para que coincida con tu ID de paquete, por lo que edu.example.manager.action.STORE se convierte en edu.example.manager.FileStore.action.STORE –

Respuesta

0

En primer lugar, puede especificar solo a qué aplicación ir; no puedes especificar a qué actividad ir; Ya he respondido cómo navegar a otra aplicación here; después de eso, tu control pasa a la otra aplicación; usted tiene que manejar allí

+1

Eso no es realmente cierto. Un intento implícito puede correlacionarse con una Actividad, un Servicio de Difusión o un Servicio. –

+1

No estoy tratando de elegir una actividad a la que ir, estoy intentando enviar un intento _implicit_ que debe hacer que Android elija qué aplicación (es) puede manejarlo. La respuesta a la que se vincula hace referencia a la apertura de una aplicación por su nombre. – skoke

6

después de buscar mucho, esto es lo que encontré:

Cuando se utiliza un incorporada tipo de acción y adjuntar un campo de datos o cuando se utiliza una acción encargo escriba sin campo de datos, un intent-filter sin un elemento data está bien.

Sin embargo, cuando define una acción personalizada y incluyen un campo de datos, debe establecer manualmente el mime-type para el URI conectado. El Android documentation afirma que

Normalmente, el tipo se deduce de los datos en sí. Al establecer este atributo, deshabilita esa evaluación y fuerza un tipo explícito.

Pero ese no es el caso. Cuando pongo en un file:// URI que terminó en .txt, Android le asignó un valor nulo mime-type, por lo que no se correspondería con cualquier intent-filter, incluso uno con un data y */*mime-type. Necesitaba configurar manualmente el tipo de intento usando setDataAndType().

En resumen: Usted debe definir manualmente de mime-type cuando se utiliza una acción personalizada con los datos de la intención.

+0

podemos usar nombres personalizados en el nombre de la acción de filtro de intento para, p. Ej. en una de nuestras aplicaciones dice app1. y desde app2 lo llaman como intento I = nuevo intento ("my_intent")? –

+0

@FarazAhmad, sí podemos. – Liangjun

Cuestiones relacionadas