приемник вещания не получит событие камеры - PullRequest
20 голосов
/ 31 декабря 2010

Я пытаюсь создать приложение, которое распознает, когда пользователь делает фотографию. Я установил класс приемника вещания и зарегистрировал его в файле манифеста:

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

Независимо от того, что я пытаюсь сделать, программа не получит трансляцию. Вот мой класс приемника:

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

Если я удаляю строку mimeType в манифесте и в своей деятельности я отправляю собственную трансляцию, используя

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

тогда я успешно получаю трансляцию и вижу окно журнала и тоста. Правильно ли я подхожу к этому? Есть что-то, что мне нужно добавить?

Ответы [ 5 ]

15 голосов
/ 04 января 2011

Я решил это, но с помощью другого метода.Вместо того, чтобы использовать широковещательный приемник, я установил файловый сервер на отдельные папки, в которые сохранялась камера.Это не так практично, как иначе, но все равно работает нормально.Вот как я это настроил:

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
11 голосов
/ 08 марта 2014

Я уверен, что этот способ работает на 100%.Я тщательно протестировал.

Зарегистрируйте свой приемник вещания в AndroidManifest.Большинство ответов выше пропускают "category android: name =" android.intent.category.DEFAULT ". BroadcastReceiver не может запуститься без этого

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

И, наконец, вы создаете класс с именем" CameraReciver.java "расширение от BroadcastReceiver и этот мой код:

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



}

После этого разверните свой проект в эмуляторе (я использую genymotion), конечно, ничего не произошло, потому что ваш BroadCastReceiver работает без графического интерфейса пользователя. Откройте приложение камеры и нажмитекнопка захвата. Если все в порядке, вы получите тост с содержанием, например «Новое фото сохранено как: хранилище / эмулировано / 0 / DCIM / Camera / IMG_20140308.jpg». Позвольте наслаждаться ^ _ ^

Спасибо«tanay khandelwal» (ответил выше) о том, как найти путь к новой фотографии, снятой камерой ^ _ ^

Моя грамматика английского языка не очень хорошая, возможно, где-то не так, но я думаю, вы понимаете, о чем я (^ _ ^). Надеюсь помочь всем

9 голосов
/ 03 сентября 2011

вы должны проверить здесь: ImageTableObserver и здесь PicasaPhotoUploader как они это делают.

В основном, у них есть наблюдатель для Media.EXTERNAL_CONTENT_URI, который будет уведомлять очто бы ни происходило на SD-карте, затем в Observer они проверяют, являются ли возвращенные данные фотографией.

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

По крайней мере, таким образом вам не нужно жестко кодировать каталог.

7 голосов
/ 12 августа 2013

Здравствуйте, друзья! Я также пытался выполнить какое-то задание по событию захвата, и после изучения и работы над ним я подготовил этот код, который работает нормально, поэтому он может помочь вам

сначала создать приемник для вашего события, напримерCameraEventReciver и тем, что вы можете реализовать свой код. Я также даю вам путь к новому изображению, чтобы он был более полезен для вашего кода

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

А в Android Manifest вам просто нужно взять несколькоразрешения и зарегистрируйте ваш приемник с фильтром намерений и соответствующие действия для захвата изображения также сделайте ваш приемник Android включен

  <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 голосов
/ 27 декабря 2012

Проблема в том, что вы поместили постоянное имя с пакетом в апострофы (в виде строки).Фактическая строковая константа имеет другое значение.

...