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.