20

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

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

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

+1

Откуда вы взяли 'com.android.camera.NEW_PICTURE'? Из того, что я могу сказать после быстрого осмотра sdk, этого действия не существует. – techiServices

+0

@sugarynugs Я нашел его на некоторых других потоках. Вот один из них, по-видимому, от источника камеры. stackoverflow.com/questions/3015448/..., когда снимок сделан, он вызывает sendBroadcast (новый Intent («com.android.camera.NEW_PICTURE», mLastContentUri)); – John

+0

какую версию Android вы тестируете? – techiServices

ответ

15

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

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

приятно! хорошо видеть кого-то, кто может думать о себе; Я смотрел на источник камеры, и метод 'storeImage' в классе' ImageCapture' отвечает за увольнение этого намерения. Этот метод только запускает намерение, если '! MIsImageCaptureIntent'. Я не смотрел дальше, но я бы подумал, что это означает, сделайте следующее, если захват изображения не произошел из-за намерения. Не знаете, как вы делаете снимок и использует ли приложение камеры намерение сделать снимок, но пищу для размышлений. – techiServices

+9

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

+3

Можете ли вы использовать это решение для мониторинга нескольких папок или вы должны создать отдельный FileObserver для каждой папки, которую вы хотите наблюдать? – gonzobrains

9

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

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

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

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

0

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

7

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

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

<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

Я пробовал, но не работал для меня ... Вот мой вопрос, который я задал, пожалуйста, помогите мне. http://stackoverflow.com/questions/24989221/how-to-get-camera-click-event-with-the-help-of-broadcast-receiver –

11

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

Зарегистрируйте свой приемник вещания в AndroidManifest. Большинство ответов выше промах «категория андроида: имя =» 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.ява»простираются от 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 "(см. выше) о том, как получить путь к новой фотографии, снятой камерой^_^

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

+0

Я пробовал, но мне это не помогло. Я также задал вопрос об этом. Вот моя работа. http://stackoverflow.com/questions/24989221/how-to-get-camera-click-event-with-the-help-of-broadcast-receiver –

+0

Выше кода работает идеально для снятых фотографий, любая идея, как мы можем получить приемник для видео? – Shrikant

+0

Я использую камеру в своем приложении.будет ли я получать тост, если пользователь сделал снимок (и был снят с экрана «Сохранить/удалить»)? – harshitgupta