Подтвердить что ты не робот

Широковещательный приемник не получит событие камеры

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

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

Зарегистрируйте свой радиовещательный приемник в AndroidManifest. Большинство ответов выше   "категория 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 работает без GUI. Позвольте открыть приложение для камеры и нажать кнопку захвата. Если все в порядке, вы получите тост с контентом, например "Новое фото сохранено как: storage/emulated/0/DCIM/Camera/IMG_20140308.jpg". Пусть наслаждайтесь ^ _ ^

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

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

Ответ 3

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

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

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

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

Ответ 4

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

сначала создайте ресивер для своего события, скажем, 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 вам просто нужно взять некоторые разрешения и зарегистрировать приемник с фильтром намерений, и соответствующие действия для захвата изображения также сделают ваш приемник андроидом включенным

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

Ответ 5

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