20

Sto provando a creare un'app che rileva quando un utente scatta una foto. Ho creato una classe ricevitore broadcast e registrato nel file manifesto:non riceverà l'evento fotocamera

<receiver android:name="photoReceiver" > 
    <intent-filter> 
    <action android:name="com.android.camera.NEW_PICTURE"/> 
     <data android:mimeType="image/*"/> 
</intent-filter> 
</receiver> 

Non importa quello che cerco di fare il programma non riceveranno la trasmissione. Qui è la mia classe ricevitore:

public class photoReceiver extends BroadcastReceiver { 
    private static final String TAG = "photoReceiver"; 

@Override 
public void onReceive(Context context, Intent intent) { 
    CharSequence text = "caught it"; 
    int duration = Toast.LENGTH_LONG; 
    Log.d(TAG, "Received new photo"); 

    Toast toast = Toast.makeText(context, text, duration); 
    toast.show(); 
} 
} 

Se rimuovo la linea mimeType nel manifesto e nella mia attività ho invio la mia trasmissione utilizzando

Intent intent = new Intent("com.android.camera.NEW_PICTURE"); 
sendBroadcast(intent); 

poi ricevo con successo la trasmissione e può vedere il registro e finestra del pane tostato. Mi sto avvicinando a questo nel modo giusto? C'è qualcosa che devo aggiungere?

+1

Da dove hai preso 'com.android.camera.NEW_PICTURE' da? Da quello che posso dire dopo una rapida occhiata al sdk, quell'azione non esiste. – techiServices

+0

@sugarynugs L'ho trovato su alcuni altri thread. Ecco uno di loro, apparentemente dalla fonte della telecamera. stackoverflow.com/questions/3015448/..., quando viene scattata una foto chiama sendBroadcast (nuovo Intento ("com.android.camera.NEW_PICTURE", mLastContentUri)); – John

+0

quale versione di Android stai testando su questo? – techiServices

risposta

15

Ho risolto questo problema utilizzando un metodo diverso. Invece di usare un ricevitore di trasmissione, ho impostato un server di file su cartelle separate su cui è stata salvata la videocamera. Non è pratico come il contrario, ma funziona comunque bene. Ecco come impostare il tutto:

FileObserver observer = new FileObserver(android.os.Environment.getExternalStorageDirectory().toString() + "/DCIM/100MEDIA") { // set up a file observer to watch this directory on sd card 
      @Override 
     public void onEvent(int event, String file) { 
      if(event == FileObserver.CREATE && !file.equals(".probe")){ // check if its a "create" and not equal to .probe because thats created every time camera is launched 
       Log.d(TAG, "File created [" + android.os.Environment.getExternalStorageDirectory().toString() + "/DCIM/100MEDIA/" + file + "]"); 
       fileSaved = "New photo Saved: " + file; 
      } 
     } 
    }; 
    observer.startWatching(); // start the observer 
+1

bello! bello vedere qualcuno che può pensare da solo; D. Stavo guardando l'origine della telecamera e un metodo 'storeImage' nella classe' ImageCapture' è responsabile per l'attivazione di tale intento. Questo metodo attiva l'intento solo se '! MIsImageCaptureIntent'. Non ho guardato oltre, ma avrei pensato che significasse, fare quanto segue se l'acquisizione dell'immagine non si verificava a causa di un intento. Non sei sicuro di come stai scattando una foto e se l'app della fotocamera utilizza l'intento di scattare una foto, ma spunti di riflessione. – techiServices

+9

Il problema con questa soluzione è che l'app ** deve essere sempre in esecuzione in background ** per osservare il filesystem. Problema maggiore e non giocando bene. –

+3

È possibile utilizzare questa soluzione per monitorare più cartelle o creare un FileObserver separato per ogni cartella che si desidera osservare? – gonzobrains

9

si dovrebbe verificare qui: ImageTableObserver e qui PicasaPhotoUploader come lo fanno.

Fondamentalmente, hanno un osservatore per Media.EXTERNAL_CONTENT_URI che notificherà qualsiasi cosa accada sulla scheda SD, quindi nell'Observer, controllano se i dati restituiti sono una foto.

camera = new ImageTableObserver(new Handler(), this, queue); 
getContentResolver().registerContentObserver(Media.EXTERNAL_CONTENT_URI, true, camera); 

Almeno in questo modo non è necessario eseguire l'hardcode della directory.

0

Il problema è che hai inserito il nome costante con il pacchetto in apostrofi (come stringa). La costante di stringa effettiva ha un valore diverso.

7

Ciao amici Sono stato anche cercando di attuare un compito sulla manifestazione cattura e dopo aver studiato e lavorare su di esso ho preparato questo codice che sta lavorando bene in modo che possa aiutare a

prima di creare un ricevitore per il vostro evento dicono CameraEventReciver e che è possibile implementare il codice di I m anche dando il percorso della nuova immagine in modo che sarà più utile a voi per il vostro codice

public class CameraEventReciver extends BroadcastReceiver { 

@Override 
public void onReceive(Context context, Intent intent) { 

    Cursor cursor = context.getContentResolver().query(intent.getData(),  null,null, null, null); 
    cursor.moveToFirst(); 
    String image_path = cursor.getString(cursor.getColumnIndex("_data")); 
    Toast.makeText(context, "New Photo is Saved as : -" + image_path, 1000).show(); 
     } 
    } 

e in Android Manifest devi solo prendere alcune autorizzazioni e registro il tuo ricevitore con filtro intent e l'azione appropriata per l'acquisizione delle immagini rendono anche i tuoi crediti er android abilitato

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> 
    <uses-permission android:name="android.permission.CAMERA" /> 

    <receiver 
     android:name="com.android.application.CameraEventReciver" 
     android:enabled="true" > 
     <intent-filter> 
      <action android:name="com.android.camera.NEW_PICTURE" /> 
      <data android:mimeType="image/*" /> 
     </intent-filter> 
    </receiver> 
+0

L'ho provato, ma non funzionava per me ... Ecco la mia domanda che ho chiesto, per favore aiutatemi. http://stackoverflow.com/questions/24989221/how-to-get-camera-click-event-with-the-help-of-broadcast-receiver –

11

Sono sicuro che in questo modo funziona al 100%. Ho provato con attenzione.

Registrare il destinatario della trasmissione in AndroidManifest. La maggior parte delle risposte di cui sopra perdere "categoria android: name =" android.intent.category.DEFAULT "BroadcastReceiver non può iniziare senza questo

<receiver 
    android:name=".CameraReciver" 
    android:enabled="true" > 
     <intent-filter> 
      <action android:name="com.android.camera.NEW_PICTURE" /> 
      <action android:name="android.hardware.action.NEW_PICTURE" /> 
      <category android:name="android.intent.category.DEFAULT" /> 
      <data android:mimeType="image/*" /> 

     </intent-filter> 
    </receiver> 

E, infine, si crea una classe denominata" CameraReciver.java" estendersi da BroadcastReceiver e questo il mio codice:.

public class CameraReciver extends BroadcastReceiver { 

@Override 
public void onReceive(Context context, Intent intent) { 
    // TODO Auto-generated method stub 
    Log.i("INFO", "Enter BroadcastReceiver"); 



Cursor cursor = context.getContentResolver().query(intent.getData(), 
       null, null, null, null); 
     cursor.moveToFirst(); 
     String image_path = cursor.getString(cursor.getColumnIndex("_data")); 
     Toast.makeText(context, "New Photo is Saved as : " + image_path, 1000) 
       .show(); 



} 

Dopo di che, distribuire il progetto per Emulator (io uso genymotion), ovviamente non è successo niente perché il vostro BroadCastReceiver funziona senza GUI Lasciate aperta applicazione fotocamera, e fai clic su pulsante di acquisizione. Se tutto è a posto, brinderai con contenuti come "Nuova foto salvata come: archiviazione/emulato/0/DCIM/Fotocamera/IMG_20140308.jpg". Divertiti^_^

Grazie " tanay khandelwal "(risposta sopra) per come ottenere il percorso della nuova foto catturata dalla telecamera^_^

La mia grammatica inglese non molto buono, forse sbagliato da qualche parte, ma penso che tu possa capire cosa intendo (^_^). Spero di aiutare tutti

+0

L'ho provato, ma non mi ha aiutato. Ho anche fatto la domanda al riguardo. Ecco il mio lavoro. http://stackoverflow.com/questions/24989221/how-to-get-camera-click-event-with-the-help-of-broadcast-receiver –

+0

Sopra il codice funziona perfettamente per le foto catturate, qualsiasi idea su come possiamo ottenere ricevitore per video catturati? – Shrikant

+0

Uso la fotocamera nella mia app.riceverò un brindisi se l'utente ha scattato l'immagine (ed è stata portata alla schermata Salva/Elimina)? – harshitgupta