Я пытаюсь загрузить изображения на сервер из внешнего хранилища, используя класс 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)))