studio picture manejo intent example camara android android-manifest android-camera android-camera-intent

android - picture - transmisor receptor no recibirá evento de la cámara



surfaceview android camera (5)

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.

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

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

No importa lo que intente hacer, el programa 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 tostada. ¿Me estoy acercando a esto de la manera correcta? ¿Hay algo que necesito agregar?


Hola amigos, también estaba intentando implementar alguna tarea en el evento de captura y, después de estudiar y trabajar, preparé este código que funciona bien para que pueda ayudarlo.

primero cree un receptor para su evento, diga CameraEventReciver y en que puede implementar su código, también le doy la ruta de la nueva imagen para que le sea más útil para 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 tiene que tomar algunos permisos y registrar su receptor con un filtro de intención y la acción apropiada para la captura de imágenes.

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


Resolví esto pero usando un método diferente. En lugar de usar un receptor de difusión, configuré un fileobserver en carpetas separadas en las que la cámara guardó. No es tan práctico como a la inversa, pero todavía funciona bien. Así es como lo configuro:

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


Seguro que así funciona el 100%. He probado con cuidado.

Registre su receptor de difusión en AndroidManifest. La mayoría de las respuestas anteriores pierden "categoría android: name =" android.intent.category.DEFAULT ". BroadcastReceiver no puede comenzar sin esto

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

Y finalmente, creas una clase llamada "CameraReciver.java" extendida desde BroadcastReceiver y este 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, implemente su proyecto en Emulator (yo uso genymotion), por supuesto, no pasó nada porque su BroadCastReceiver funciona sin GUI. Te permite abrir la aplicación de la cámara y hacer clic en el botón de captura. Si todo está bien, obtendrás un brindis con contenido como "La nueva foto se guarda como: almacenamiento / emulada / 0 / DCIM / Cámara / IMG_20140308.jpg". Vamos a disfrutar ^ _ ^

Gracias "tanay khandelwal" (contestada arriba) por cómo obtener la ruta de la nueva foto capturada por la cámara ^ _ ^

Mi gramática inglesa no es muy buena, quizás esté equivocada en alguna parte, pero creo que puedes entender lo que quiero decir (^_^). Espero ayudar a todos


ImageTableObserver consultar aquí: ImageTableObserver y aquí PicasaPhotoUploader cómo lo hacen.

Básicamente, tienen un observador para Media.EXTERNAL_CONTENT_URI que notificará lo 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 tienes que codificar el directorio.