DroidNinja / Android-FilePicker

Photopicker and document picker for android
https://arunsharma.me/blog/integrate-android-file-picker-photopicker-document-picker-android/
2.7k stars 558 forks source link

Android 10 showing placeholder images even though requestLegacyExternalStorage = "true" ? #324

Open RageshAntony opened 3 years ago

RageshAntony commented 3 years ago

in Android 10 (ONE UI 2) , it's showing placeholder images even though requestLegacyExternalStorage = "true" ? I am using latest 2.2.5

My manifest

    <application
        android:name=".MyApp"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme"
        android:usesCleartextTraffic="true"
        android:requestLegacyExternalStorage="true"
        tools:ignore="AllowBackup,GoogleAppIndexingWarning"
        tools:targetApi="m">

FilePicker call :

    private fun pickImage() {
        FilePickerBuilder.Companion.instance
                .setMaxCount(10)
                .setActivityTheme(R.style.AppTheme)
                .setActivityTitle( getString(R.string.select_list_photos))
                .enableImagePicker(true)
                .enableVideoPicker(false)
                .enableCameraSupport(true)
                .showFolderView(false)
                .showGifs(false)
                .enableSelectAll(false)
                .pickPhoto(this)
    }

    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
        when (requestCode) {
            FilePickerConst.REQUEST_CODE_PHOTO -> {
                if (resultCode == Activity.RESULT_OK && data != null) {
                    val photoPaths = ArrayList<String>()
                    photoPaths.addAll(data.getStringArrayListExtra(FilePickerConst.KEY_SELECTED_MEDIA))
                    val uriPaths = data.getParcelableArrayListExtra<Uri>(FilePickerConst.KEY_SELECTED_MEDIA)
                    validateFileSize(uriPaths)
                }
            }
        }
    }

Result

IMG-20210428-WA0001

Please help me

vtuan070978 commented 3 years ago

thanks for your reply, I mean is when clicking on the icon "take photo" can't work on Android 11, Android 10 is ok. Do you check on Android 11?

RageshAntony commented 3 years ago

thanks for your reply, I mean is when clicking on the icon "take photo" can't work on Android 11, Android 10 is ok.

I check only in Android 10 . Not working in 10 but working in 9

vtuan070978 commented 3 years ago

hi all, I updated the lib, not using permission WRITE, it worked very well for me, some update in mine:

  1. update dispatchTakePictureIntent function fun dispatchTakePictureIntent(): Intent? { val takePictureIntent = Intent(MediaStore.ACTION_IMAGE_CAPTURE) // Ensure that there's a camera activity to handle the intent if (Build.VERSION.SDK_INT >=29) { filephoto = getImageFile(File(mContext.getFilesDir(), "filepicker")) val authority = mContext.packageName + mContext.getString(R.string.image_picker_provider_authority_suffix) photoURI = FileProvider.getUriForFile(mContext, authority, filephoto!!) takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI) return takePictureIntent

    } else {
        if (takePictureIntent.resolveActivity(mContext.packageManager) != null) {
            // Create the File where the photo should go
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
                filephoto = getImageFile(File(mContext.getFilesDir(), "filepicker"))
                val authority =
                        mContext.packageName + mContext.getString(R.string.image_picker_provider_authority_suffix)
                photoURI = FileProvider.getUriForFile(mContext, authority, filephoto!!)
                takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI)
            } else {
                filephoto = getImageFile(File(mContext.getExternalCacheDir(), "filepicker"))
                takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(filephoto))
            }
            return takePictureIntent
        }
    }
    return null

    }

  2. Because the app did not use permission WRITE so the photo after being taken will be stored in the internal memory.
  3. Ater took you to have to call the function updateList again
  4. In updateList function, you have to get photos in the internal memory

// get all photo in the internal memory var arrayList = ArrayList(medias) var file: File? = null

        if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.N) {
            file = File(activity?.getExternalCacheDir(), "filepicker")
        } else {
            file = File(activity?.filesDir, "filepicker")
        }
        if (file != null && file.isDirectory!!) {
            val children = file.listFiles()

            Arrays.sort(children
            ) { o1, o2 -> java.lang.Long.compare(o1?.lastModified()!!, o2?.lastModified()!!) }
            var index = 0
            for (pathString in children) {
                if (pathString.name.lastIndexOf(".jpg") > 0) {
                    if (!checkExist(arrayList, pathString.name)) {
                        val filePhoto = File(file.absolutePath + "/" + pathString.name)
                        if (filePhoto.length() > 0) {
                            val media = Media(
                                0,
                                getFileName(pathString.name),
                                Uri.fromFile(filePhoto),
                                1
                            )
                            arrayList.add(index, media)
                        }
                    }
                }
            }
            mCurrentMedias = arrayList.toMutableList().toList()
        }

here is the lib I updated, worked very well in my project filepicker.zip