el receptor de difusión no recibirá el evento de la cámara

Intento crear una aplicación que detecte cuándo un usuario toma una foto. Configuré una clase de receptor de difusión y lo registré en el archivo de manifiesto por:

      

No importa lo que bash hacer, el progtwig no recibirá la transmisión. Aquí está mi clase de receptor:

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

Si elimino la línea mimeType en el manifiesto y en mi actividad, envío mi propia transmisión usando

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

luego recibo con éxito la transmisión y puedo ver la ventana de registro y brindis. ¿Me estoy acercando a esto de la manera correcta? ¿Hay algo que deba agregar?

Lo resolví pero usando un método diferente. En lugar de utilizar un receptor de difusión, configuré un servidor de archivos en carpetas separadas en las que se guardó la cámara. No es tan práctico como la otra opción, pero todavía funciona bien. Así es como lo configuré:

 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 

Estoy seguro de que esto funciona al 100%. Probé con cuidado.

Registre su receptor de difusión en AndroidManifest. La mayoría de las respuestas anteriores omiten “categoría android: nombre =” android.intent.category.DEFAULT “. BroadcastReceiver no puede comenzar sin este

          

Y finalmente, creas una clase llamada “CameraReciver.java” que se extiende desde BroadcastReceiver y este es mi código:

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

Después de eso, implementa tu proyecto en Emulator (yo uso genymotion), por supuesto no pasó nada porque tu BroadCastReceiver funciona sin GUI. Le permite abrir la aplicación de la cámara y hacer clic en el botón de captura. Si todo está bien, ofrecerá un brindis con contenido como “La foto nueva se guarda como: almacenamiento / emulado / 0 / DCIM / Cámara / IMG_20140308.jpg”. Deje disfrutar ^ _ ^

Gracias “tanay khandelwal” (respondió arriba) para saber cómo obtener el camino de la nueva foto capturada por la cámara ^ _ ^

Mi gramática inglesa no es muy buena, tal vez esté mal en algún lado, pero creo que puedes entender lo que quiero decir (^_^). Espero ayudar a todos

deberías echar un vistazo aquí: ImageTableObserver y aquí PicasaPhotoUploader cómo lo hacen.

Básicamente, tienen un observador de Media.EXTERNAL_CONTENT_URI que notificará cualquier cosa que ocurra en la tarjeta SD, luego en el Observer, verifican si los datos devueltos son una foto.

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

Al menos de esta manera, no es necesario codificar el directorio.

Hola amigos, también estaba tratando de implementar alguna tarea en el evento de captura y, después de estudiarla y trabajar en ella, preparé este código, que está funcionando bien para que pueda ayudarte.

primero cree un receptor para su evento, digamos CameraEventReciver y en el que puede implementar su código. También le estoy dando la ruta de la nueva imagen, por lo que le será más útil su código.

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

Y en Android Manifest solo tienes que tomar algunos permisos y registrar tu receptor con filtro de intención y la acción apropiada para capturar imágenes también hacen que tu receptor Android esté habilitado

          

El problema es que has puesto el nombre constante con el paquete en apóstrofes (como cadena). La constante de cadena real tiene un valor diferente.