Не удалось найти класс "android .provider.MediaStore $ Downloads" - PullRequest
0 голосов
/ 24 февраля 2020

Я использую коды, данные Бао Лейем с именем личное удовольствие saveImage в как сохранить растровое изображение в android галерее , чтобы сохранить растровое изображение

Решить Устарел проблемы в Kotlin, я удалил эти строки:

 //values.put(MediaStore.Images.Media.DATA, file.absolutePath) 
//context.contentResolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values)

и добавил это:

 val contentValues = ContentValues()

 contentValues.put(MediaStore.Images.Media.RELATIVE_PATH, folderName)

 this.applicationContext.contentResolver.insert(MediaStore.Downloads.EXTERNAL_CONTENT_URI, contentValues)

Затем я вызвал функцию (в DidtodayActivity) как:

saveImage(bitmapImg, this.applicationContext)

Изображение загружается в Телефон> Android> Данные> com.example.MyApp1> files> MyFiles . Я вижу загруженное изображение на моем устройстве.

Но файл активности внезапно закрывается (и activity_main . xml открывается напрямую) из-за ошибки runTime в этой строке:

this.applicationContext.contentResolver.insert(MediaStore.Downloads.EXTERNAL_CONTENT_URI, contentValues)

Причина :

java.lang.ClassNotFoundException: Didn't find class "android.provider.MediaStore$Downloads" on path: DexPathList[[zip file "/data/app/com.example.MyApp1-rvQQjSAj4NilLch2h12faQ==/base.apk"],nativeLibraryDirectories=[/data/app/com.example.MyApp1-rvQQjSAj4NilLch2h12faQ==/lib/arm64, /data/app/com.example.MyApp1-rvQQjSAj4NilLch2h12faQ==/base.apk!/lib/arm64-v8a, /system/lib64]]

Подробное сообщение:

**Didn't find class "android.provider.MediaStore$Downloads"** on path: DexPathList[[zip file "/data/app/com.example.MyApp1-rvQQjSAj4NilLch2h12faQ==/base.apk"],nativeLibraryDirectories=[/data/app/com.example.MyApp1-rvQQjSAj4NilLch2h12faQ==/lib/arm64, /data/app/com.example.MyApp1-rvQQjSAj4NilLch2h12faQ==/base.apk!/lib/arm64-v8a, /system/lib64]]

Не удалось разрешить: Landroid / provider / MediaStore $ Загрузки;

Уровень модуля build.gradle:

apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
apply plugin: 'com.google.gms.google-services'

android {
    compileSdkVersion 29
    buildToolsVersion "29.0.2"

    defaultConfig {
        applicationId "com.example.MyApp1"
        minSdkVersion 16
        targetSdkVersion 29
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"

        multiDexEnabled true

    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }

    aaptOptions{
        noCompress "tflite"
        noCompress "lite"
    }
}

Кроме того, следующий код был добавлен в часть зависимостей в файле build.gradle:

 implementation "com.android.support:multidex:2.0.1"

И я добавил этот код в файл манифеста:

  android:name="androidx.multidex.MultiDexApplication">

Как решить проблему с ошибкой во время выполнения ?

Я пробовал это;

this.applicationContext.contentResolver.insert( MediaStore.Images.Media.EXTERNAL_CONTENT_URI, contentValues)

вместо этого;

this.applicationContext.contentResolver.insert(MediaStore.Downloads.EXTERNAL_CONTENT_URI, contentValues)

Но он снова вылетает с этой ошибкой во время выполнения;

java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=203, result=-1, data=Intent { (has extras) }} to 
activity {com.example.MyApp1/com.example.MyApp1.DidtodayActivity}: java.lang.SecurityException: Permission Denial: writing com.android.providers.media.MediaProvider uri 
content://media/external/images/media from pid=3812, uid=10270 
requires android.permission.WRITE_EXTERNAL_STORAGE, or grantUriPermission()

Однако следующий код уже находится в файле манифеста:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

Итак, есть ли какая-либо другая альтернатива для использования вместо MediaStore.Downloads ? * 107 0 *

1 Ответ

0 голосов
/ 24 февраля 2020

После Android 5.0 мультидексирование включено по умолчанию.

Взято из документации :

Поддержка мультидекса для Android 5.0 и выше Android 5.0 (уровень API 21) и выше использует среду выполнения под названием ART, которая изначально поддерживает загрузку нескольких файлов DEX из файлов APK. ART выполняет предварительную компиляцию во время установки приложения, которая сканирует файлы classesN.dex и компилирует их в один файл .oat для выполнения устройством Android. Поэтому, если ваш minSdkVersion равен 21 или выше, мультидекс включен по умолчанию и вам не нужна библиотека поддержки мультидекса.

Независимо от этого вам необходимо выполнить следующее:

В build.gradle:

android {
defaultConfig {
    ...
    minSdkVersion 15 
    targetSdkVersion 28
    multiDexEnabled true. <----
  }
...
}

AndroidManifest. xml:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.myapp">
  <application
        android:name="android.support.multidex.MultiDexApplication" >
    ...
</application>

Если вы не используете набор библиотек AndroidX:

dependencies {
  implementation 'com.android.support:multidex:1.0.3'
}

Если вы используете AndroidX:

dependencies {
  def multidex_version = "2.0.1"
  implementation 'androidx.multidex:multidex:$multidex_version'
 }
...