2012-09-06 12 views
8

Ho cercato di ottenere due attività in due applicazioni separate per comunicare utilizzando un'azione personalizzata e un intento implicito.Azioni personalizzate utilizzando intenti impliciti tra le applicazioni

La prima applicazione (server), ha il seguente manifesto:

<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 seconda applicazione crea un intento come segue:

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

Il suo manifesto è normale. Quando provo a trasmettere l'intento nell'applicazione client, tuttavia, ottengo un'attività non trovato eccezione:

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) 

ciò che sta causando Android di non riconoscere l'attività dichiarata nella seconda applicazione? Grazie.

+0

provare a inserire un attributo esportato nell'attività 'FileStore' nel manifest. – Varun

+0

anche per me a volte funziona a dint quando stavo impostando l'azione usando 'setAction()', ma poi passai a usare il costruttore 'Intent' per impostare l'azione, es:' nuovo Intent ("edu.example, manager. action.STORE ");' – Varun

+0

Provare a modificare l'azione in modo che corrisponda all'ID del pacchetto, quindi edu.example.manager.action.STORE diventa edu.example.manager.FileStore.action.STORE –

risposta

0

In primo luogo è possibile specificare solo l'applicazione a cui accedere; non puoi specificare a quale avidità andare; Ho già risposto come navigare in un'altra app here; dopodiché il tuo controllo passa all'altra app; bisogna gestire la cosa non ci

+1

Questo non è proprio vero. Un intento implicito può essere associato a un'attività, a BroadcastReceever o a un servizio. –

+1

Non sto cercando di scegliere un'attività da svolgere - Sto tentando di inviare un intento _implicit che dovrebbe indurre Android a scegliere le applicazioni in grado di gestirlo. La risposta a cui si fa riferimento si riferisce all'apertura di un'applicazione per nome. – skoke

6

Dopo molta ricerca, ecco cosa ho trovato:

Quando si utilizza un built-in tipo di azione e allegare un campo dati o quando si utilizza un'azione personalizzata digitare senza campo dati, un elemento intent-filter senza un elemento data è ok.

Tuttavia, quando si definisce un'azione personalizzata e include un campo dati, è necessario impostare manualmente mime-type per l'URI collegato. Il Android documentation afferma che

Normalmente il tipo viene dedotto dai dati stessi. Impostando questo attributo, si disabilita tale valutazione e si forza un tipo esplicito.

Ma questo non è il caso. Quando ho messo in un file:// URI che si è conclusa nel .txt, Android assegnato un nulla mime-type, in modo che non sarebbe partita qualsiasiintent-filter, anche uno con un data e */*mime-type. Avevo bisogno di impostare manualmente il tipo di intento usando setDataAndType().

In breve: È necessario definire manualmente di mime-type quando si utilizza un'azione personalizzata con i dati di un intento.

+0

possiamo usare nomi personalizzati nel nome dell'azione del filtro intent per es. in una delle nostre app dice app1. e da app2 chiamalo come intento I = nuovo intento ("my_intent")? –

+0

@FarazAhmad, sì, possiamo. – Liangjun

Problemi correlati