Я создаю простое приложение для Android, отвечающее за шифрование изображений.
Это приложение должно автоматически обнаруживать изображения с конфиденциальными данными (документами или лицами) сразу после их сохранения на устройстве и предлагать пользователю зашифровать их с помощью уведомления с сообщением типа «Эй, чувак! Мы обнаружили незашифрованные конфиденциальные изображения в вашем хранилище. Не могли бы вы зашифровать это?
Что мне нужно сделать, это определить, появился ли какой-то новый файл в папке DCIM, проанализировать его, если он содержит конфиденциальные данные, и если это произойдет, затем нажать такое уведомление, чтобы пользователь мог щелкнуть по нему и зашифровать это изображение. Мне нужно, чтобы это приложение работало с последними версиями Android (с Android я не могу слушать неявные трансляции и запускать службы в фоновом режиме), поэтому я использовал FirebaseJobDispatcher, где я установил contentUriTrigger для папки DCIM в качестве триггера.
Проблема в том, что этот триггер не работает (мой JobService не был запущен), когда я делаю снимок и не могу понять, почему. Об этом действительно плохая документация. Все, что я знаю, я нашел в исходном коде официального репо:
https://github.com/firebase/firebase-jobdispatcher-android
Вот мой код:
MainActivity:
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_safe)
ActivityCompat.requestPermissions(this, arrayOf(Manifest.permission.WRITE_EXTERNAL_STORAGE), 1)
val dispatcher = FirebaseJobDispatcher(GooglePlayDriver(this))
val dcimUri = Uri.parse(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM).path)
val myJob = dispatcher.newJobBuilder()
.setService(NotificationJob::class.java)
.setTag("com.something.something.NOTIFICATION_JOB")
.setRecurring(true)
.setLifetime(Lifetime.FOREVER)
.setTrigger(Trigger.contentUriTrigger(listOf(
ObservedUri(dcimUri, ObservedUri.Flags.FLAG_NOTIFY_FOR_DESCENDANTS)
)))
.build()
dispatcher.mustSchedule(myJob)
}}
JobService:
class NotificationJob: JobService() {
override fun onStopJob(job: JobParameters?): Boolean {
Log.d("NotJob", "job stopped")
return true
}
override fun onStartJob(job: JobParameters?): Boolean {
Notifier.pushEncryptonNotification(applicationContext)
Log.d("NotJob", "job started")
return true
}}
Manifest:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.saomething.something">
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
</intent-filter>
</activity>
<service
android:exported="false"
android:name=".job.NotificationJob">
<intent-filter>
<action android:name="com.firebase.jobdispatcher.ACTION_EXECUTE"/>
</intent-filter>
</service>
</application>
ИНФОРМАЦИЯ:
- Для тех, кто не знает разрешения WRITE, включите также READ.
- Notifier - мой класс менеджера, который обрабатывает уведомления Android, и вы можете предположить, что он работает.
- Логика для анализа изображений еще не реализована. Я хочу добавить его в метод onStartJob. Он будет работать асинхронно и только при обнаружении конфиденциальных данных будет вызывать уведомитель (сейчас я просто хочу видеть уведомление каждый раз, когда папка DCIM будет меняться)
У кого-нибудь была такая проблема раньше? Если нет, есть ли другой способ реализовать такое поведение? Пожалуйста, помогите!