Невозможно получить доступ к изображениям из внешнего хранилища через WorkManager, когда приложение работает в фоновом режиме android - PullRequest
0 голосов
/ 21 июня 2020

Я пытаюсь загрузить изображения на сервер из внешнего хранилища, используя класс Worker в диспетчере работ.

class CloudWorker(context: Context, workerParams: WorkerParameters) :
Worker(context, workerParams) {
val fireStore = FirebaseFirestore.getInstance()

@SuppressLint("LogNotTimber")
override fun doWork(): Result {
    val appContext = applicationContext
    val dataString = inputData.getString(KEY_NOTE_DATA)
    val data = Gson().fromJson(dataString, NoteData::class.java)
    makeStatusNotification("Uploading Notes", appContext)
    Log.i("uri:"," ${data.uri}")

    val resolver = appContext.contentResolver

    appContext.grantUriPermission(appContext.packageName,
        Uri.parse(data.uri),
        Intent.FLAG_GRANT_WRITE_URI_PERMISSION or Intent.FLAG_GRANT_READ_URI_PERMISSION
    )

    val picture = BitmapFactory.decodeStream(resolver.openInputStream(Uri.parse(data.uri)))
    // Create a storage reference from our app
    val storage = Firebase.storage
    // Create a storage reference from our app
    val storageRef = storage.reference

    val baos = ByteArrayOutputStream()
    picture.compress(Bitmap.CompressFormat.JPEG, 100, baos)
    val imageDataX: ByteArray = baos.toByteArray()
    var pathX = "images/"+System.currentTimeMillis().toString()+".jpg"
    val mountainImagesRef = storageRef.child(pathX)
    val uploadTask = mountainImagesRef.putBytes(imageDataX)
    uploadTask.addOnSuccessListener {
            Log.i("sync_","Image uploaded"+ it.metadata!!.path+"   :  "+it.metadata!!.name)
        data.uri= it.metadata!!.path
        fireStore.collection("notes")
            .add(data)
            .addOnSuccessListener {
                Log.i("sync_","Sync Succes")
                if(isStopped)
                    Log.i("sync_","Worker Stopped")

            }.addOnFailureListener {
                Log.i("sync_","Sync Succes")
            }
    }.addOnFailureListener{
        Log.e("sync_","Image not uploaded"+it.toString())
    }

    Timber.i("sync_data: $dataString")


    Log.i("sync_","Called before firestore"+dataString)
    return Result.success()

}

}

Если приложение запущено на переднем плане, все работает отлично.

Если приложение закрыто, выдается ошибка Исключение безопасности: разрешение отказано.

Вот подробности ошибки.

2020-06-21 12:20:45.903 17882-17951/com.techolution.firestore W/ProviderInstaller: Failed to load providerinstaller module: No acceptable module found. Local version is 0 and remote version is 0.
2020-06-21 12:20:45.927 17882-17941/com.techolution.firestore E/WM-WorkerWrapper: Work [ id=5b107b9e-0d74-41e2-81df-fdaccf97e050, tags={ com.techolution.firestore.services.CloudWorker } ] failed because it threw an exception/error
java.util.concurrent.ExecutionException: java.lang.SecurityException: UID 10417 does not have permission to content://com.google.android.apps.photos.contentprovider/-1/1/content%3A%2F%2Fmedia%2Fexternal%2Fimages%2Fmedia%2F173457/ORIGINAL/NONE/image%2Fjpeg/2000081288 [user 0]
    at androidx.work.impl.utils.futures.AbstractFuture.getDoneValue(AbstractFuture.java:516)
    at androidx.work.impl.utils.futures.AbstractFuture.get(AbstractFuture.java:475)
    at androidx.work.impl.WorkerWrapper$2.run(WorkerWrapper.java:298)
    at androidx.work.impl.utils.SerialExecutor$Task.run(SerialExecutor.java:91)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
    at java.lang.Thread.run(Thread.java:764)
 Caused by: java.lang.SecurityException: UID 10417 does not have permission to content://com.google.android.apps.photos.contentprovider/-1/1/content%3A%2F%2Fmedia%2Fexternal%2Fimages%2Fmedia%2F173457/ORIGINAL/NONE/image%2Fjpeg/2000081288 [user 0]
    at android.os.Parcel.createException(Parcel.java:1950)
    at android.os.Parcel.readException(Parcel.java:1918)
    at android.os.Parcel.readException(Parcel.java:1868)
    at android.app.IActivityManager$Stub$Proxy.grantUriPermission(IActivityManager.java:4716)
    at android.app.ContextImpl.grantUriPermission(ContextImpl.java:1865)
    at android.content.ContextWrapper.grantUriPermission(ContextWrapper.java:781)
    at com.techolution.firestore.services.CloudWorker.doWork(CloudWorker.kt:42)
    at androidx.work.Worker$1.run(Worker.java:85)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641) 
    at java.lang.Thread.run(Thread.java:764) 

Я отправляю URI в NoteData и получение его из рабочего класса. Вышеуказанная ошибка появляется в строке, указанной ниже.

val picture = BitmapFactory.decodeStream(resolver.openInputStream(Uri.parse(data.uri)))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...