Android - FirebaseJobDispatcher - contentUriTrigger не работает - PullRequest
0 голосов
/ 03 ноября 2018

Я создаю простое приложение для 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 будет меняться)

У кого-нибудь была такая проблема раньше? Если нет, есть ли другой способ реализовать такое поведение? Пожалуйста, помогите!

...