Я представлю вам часть кода в моем приложении, которое отправляет каждое изображение, которое вы делаете с помощью телефона, по электронной почте в заранее определенный список писем. Отправляющее электронное письмо и список получаемых электронных писем хранятся в общих настройках. Я использую класс обслуживания и FileObserver, чтобы посмотреть каталог картинок телефона.
В моем случае эта схема решает также проблему с FileObserver, который прекращает работу через некоторое время.
- Используйте действие (StartServicesActivity) для запуска службы (FileObserverService) в качестве службы Foreground.
- Используйте класс BroadcastReceiver (в примере CommonReceiver) для перезапуска вашего сервиса в некоторых особых ситуациях и в случае его уничтожения.
- Каждый раз, когда служба перезапускается (выполняет onStartCommand), воссоздайте объект FileObserver для просмотра каталога с изображениями.
Я использовал этот код в своем приложении «Автоматически отправлять фотографии по электронной почте»
https://play.google.com/store/apps/details?id=com.alexpap.EmailPicturesFree
Вот класс CommonReceiver.
public class CommonReceiver extends BroadcastReceiver {
public void onReceive(Context paramContext, Intent paramIntent)
{
paramContext.startService(new Intent(paramContext, FileObserverService.class));
}
}
Вот его определение в AndroidManifest.xml непосредственно перед тегом закрытия приложения.
<receiver android:name="com.alexpap.services.CommonReceiver">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED"/>
</intent-filter>
<intent-filter>
<action android:name="android.net.conn.CONNECTIVITY_CHANGE"/>
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.USER_PRESENT"/>
</intent-filter>
</receiver>
Запуск службы в действии StartServicesActivity.
Intent iFileObserver = new Intent(StartServicesActivity.this, FileObserverService.class);
StartServicesActivity.this.startService(iFileObserver);
Вот метод onCreate () службы FileObserverService.
//Class variables
MediaFileObserver observPictures = null;
String pathToWatchPic = "";
public void onCreate() {
pathToWatchPic = Environment.getExternalStorageDirectory().toString() + "/DCIM/100MEDIA";
File mediaStorageDir = new File(pathToWatchPic);
if (!mediaStorageDir.exists()){
pathToWatchPic = Environment.getExternalStorageDirectory().toString() + "/DCIM/Camera";
}
}
Вот метод onStartCommand () службы FileObserverService.
public int onStartCommand(Intent intent, int flags, int startId) {
int res = super.onStartCommand(intent, flags, startId);
if (observPictures != null){
observPictures.stopWatching();
}
//each time service is restarted, observPictures object is recreated
//and observation is restarted. This way File Observer never stops.
observPictures = new MediaFileObserver(this, pathToWatchPic);
observPictures.startWatching();
startServiceForeground(intent, flags, startId);
return Service.START_STICKY;
}
public int startServiceForeground(Intent intent, int flags, int startId) {
Intent notificationIntent = new Intent(this, StartServicesActivity.class);
notificationIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0);
Notification notification = new NotificationCompat.Builder(this)
.setContentTitle("File Observer Service")
.setContentIntent(pendingIntent)
.setOngoing(true)
.build();
startForeground(300, notification);
return START_STICKY;
}
Служба перезапускается также при каждом включении телефона и после перезагрузки.