20

Ich versuche eine App zu erstellen, die erkennt, wenn ein Benutzer ein Foto macht. Ich habe eine Rundfunkempfänger Klasse und registriert es in der Manifest-Datei durch:Broadcast-Empfänger wird kein Kameraereignis empfangen

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

Egal, was ich versuche, das Programm zu tun, wird nicht die Sendung erhalten. Hier ist mein Empfänger Klasse:

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

Wenn ich die mime Linie im Manifest und in meiner Tätigkeit entfernen sende ich meine eigene Sendung mit

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

dann erfolgreich ich die Sendung empfangen und das Protokoll sehen und Toast-Fenster. Komme ich dem richtig zu? Gibt es etwas, das ich hinzufügen muss?

+1

Woher hast du 'com.android.camera.NEW_PICTURE'? Von dem, was ich nach einem kurzen Blick auf die SDK sagen kann, existiert diese Aktion nicht. – techiServices

+0

@sugarynugs Ich fand es auf einigen anderen Threads. Hier ist einer von ihnen, anscheinend von der Quelle der Kamera. stackoverflow.com/questions/3015448/..., wenn ein Bild aufgenommen wird, ruft es sendBroadcast auf (neue Absicht ("com.android.camera.NEW_PICTURE", mLastContentUri)); – John

+0

Welche Version von Android testen Sie dies? – techiServices

Antwort

15

Ich löste das aber mit einer anderen Methode. Anstatt einen Rundfunkempfänger zu verwenden, habe ich einen Dateiserver auf separaten Ordnern eingerichtet, in denen die Kamera gespeichert wurde. Es ist nicht so praktisch wie der andere Weg, aber es funktioniert immer noch gut. Hier ist, wie ich es einrichten:

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

nett! gut jemanden zu sehen, der für sich selbst denken kann; D. Ich schaute auf die Kameraquelle und eine Methode 'storeImage' in der' ImageCapture' Klasse ist verantwortlich für die Auslösung dieser Absicht. Diese Methode feuert nur die Absicht wenn '! MIsImageCaptureIntent'. Ich habe nicht weiter gesucht, aber ich hätte gedacht, dass das bedeutet, Folgendes zu tun, wenn die Bilderfassung nicht aufgrund einer Absicht erfolgte. Nicht sicher, wie du ein Foto machst und ob die Kamera-App die Absicht nutzt, ein Bild aufzunehmen, aber Denkanstöße gibt. – techiServices

+9

Das Problem mit dieser Lösung ist, dass die App ** ständig im Hintergrund laufen muss **, um das Dateisystem zu beobachten. Hauptproblem und nicht nett zu spielen. –

+3

Können Sie diese Lösung verwenden, um mehrere Ordner zu überwachen, oder müssen Sie einen separaten FileObserver für jeden Ordner erstellen, den Sie überwachen möchten? – gonzobrains

9

Sie hier ansehen sollten: ImageTableObserver und hier PicasaPhotoUploader wie sie es tun.

Grundsätzlich haben sie einen Beobachter für Media.EXTERNAL_CONTENT_URI, die über was auch immer geschieht auf der SD-Karte benachrichtigt werden, dann im Observer, sie überprüfen, ob die zurückgegebenen Daten ein Foto ist.

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

Zumindest müssen Sie das Verzeichnis nicht fest codieren.

0

Das Problem ist, dass Sie den konstanten Namen mit Paket in Apostrophe (als String) gesetzt haben. Die tatsächliche Stringkonstante hat einen anderen Wert.

7

Hallo Freunde, die ich auch einige Aufgaben auf Capture-Ereignis umzusetzen versuchte, und nach dem Studium und der Arbeit an es ich diesen Code hergestellt, das funktioniert prima, so dass es Sie

helfen kann

zuerst einen Empfänger für Ihre Veranstaltung erstellen sagen CameraEventReciver und dass können Sie Ihren Code implementieren ich bin auch Sie den Pfad des neuen Bildes zu geben, damit es Ihnen mehr von Nutzen sein wird für Ihren Code

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

und in Android Manifest Sie müssen nur einige Berechtigungen übernehmen und registrieren Ihr Empfänger mit Absicht Filter und entsprechende Aktion für die Bilderfassung machen auch Ihren Empfang er android aktiviert

<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

Ich habe es versucht, aber funktioniert nicht für mich ... Hier ist meine Frage, die ich fragte, bitte helfen Sie mir. http://StackOverflow.com/Questions/24989221/How-To-get-Camera-Click-Event-with-the-Help-of-broadcast-Receiver –

11

Ich sicher, dass dieser Weg 100% funktioniert. Ich habe es sorgfältig getestet.

Registrieren Sie Ihren Rundfunkempfänger in AndroidManifest. Die meisten Antworten über Miss „Kategorie android: name =“ android.intent.category.DEFAULT „BroadcastReceiver kann nicht ohne diese

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

beginnen und schließlich erstellen Sie eine Klasse mit dem Namen“ CameraReciver.java“erstrecken sich von BroadcastReceiver und diesen meinen Code.

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



} 

Danach, implementieren Projekt Emulator (ich benutze genymotion), natürlich nichts passiert, weil Ihr BroadCastReceiver ohne GUI funktioniert Öffnen Kamera-App lassen, und Klicken Sie auf Aufnahme Schaltfläche Wenn alles in Ordnung ist, erhalten Sie einen Toast mit Inhalt wie "Neues Foto wird gespeichert als: Speicher/emuliert/0/DCIM/Kamera/IMG_20140308.jpg". Lassen Sie genießen^_^

Dank " tanay khandelwal "(oben beantwortet) für, wie man den Pfad des neuen Fotos erhält, das durch Kamera gefangen wird^_^

meine englische Grammatik nicht sehr gut, vielleicht falsch irgendwo, aber ich denke du verstehst was ich meine (^_^). Ich hoffe, allen zu helfen

+0

Ich versuchte es, aber es hat mir nicht geholfen. Ich habe auch die Frage dazu gestellt. Hier ist meine Arbeit. http://stackoverflow.com/questions/24989221/how-to-get-camera-click-event-with-the-help-of-broadcast-receiver –

+0

oben Code funktioniert perfekt für Fotos erfasst, jede Idee, wie wir bekommen können Empfänger für Videos erfasst? – Shrikant

+0

Ich benutze die Kamera in meiner App.Bekomme ich Toast, wenn der Benutzer das Bild gemacht hat (und zum Bildschirm "Speichern/Verwerfen" gebracht wurde)? – harshitgupta

Verwandte Themen