Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

适配android13了 #2499

Closed
AndroidMrYang opened this issue Sep 27, 2022 · 8 comments
Closed

适配android13了 #2499

AndroidMrYang opened this issue Sep 27, 2022 · 8 comments

Comments

@AndroidMrYang
Copy link

Current use version?

该适配android13 了
READ_EXTERNAL_STORAGE权限被细化了,开发者需要使用READ_MEDIA_IMAGE、READ_MEDIA_VIDEO、READ_MEDIA_AUDIO 来替代适配;通过官方提供的 Intent(MediaStore.ACTION_PICK_IMAGES); 打开的系统相册选择组件

@Valor2
Copy link

Valor2 commented Sep 28, 2022

是吧READ_EXTERNAL_STORAGE 权限替换成READ_MEDIA_IMAGE、READ_MEDIA_VIDEO、READ_MEDIA_AUDIO 来替代适配嘛?最近上架,google拒绝了理由READ_EXTERNAL_STORAGE
“所有文件访问权限”政策:不是核心功能 不给过

@liyuhaolol
Copy link

自己下源码,把框架的权限校验和请求全部删除,直接调用相册api,然后外部,自己申请对应权限后,在启动这个框架就好了。

@Petterpx
Copy link

着急的话,自己先处理下吧,这个框架已经写的很好了。自己拦截权限处理setPermissionsInterceptListener,然后将READ_EXTERNAL_STORAGE和WRITE替换为READ_MEDIA_IMAGE...即可,非常简单。

@Petterpx
Copy link

Petterpx commented Oct 28, 2022

不想fork代码的话,自己拦截权限处理即可。如下所示:

/** @author petterp 结合XXPermissions 权限适配simple */
/** 拦截相册库的权限申请流程,simple */
class OnPermissionsInterceptListenerImpl : OnPermissionsInterceptListener {
    override fun requestPermission(
        fragment: Fragment?,
        permissionArray: Array<out String>?,
        call: OnRequestPermissionListener?
    ) {
        if (permissionArray == null || fragment == null || fragment.context == null) return
        if (XXPermissions.isGranted(fragment.context, permissionArray.toCompatPermissions)) {
            call?.onCall(permissionArray, true)
            return
        }
        // 这里去申请自己的权限,可以在此处增加弹窗询问用户是否需要给权限
        XXPermissions.with(fragment)
            .permission(permissionArray.toCompatPermissions)
            .request(OnPermissionCallbackImpl(fragment, permissionArray, call))
    }

    override fun hasPermissions(fragment: Fragment?, permissionArray: Array<out String>?): Boolean {
        if (permissionArray == null || fragment == null) return false
        return XXPermissions.isGranted(
            fragment.context,
            permissionArray.toCompatPermissions
        )
    }
}

/** 拦截相册库的权限拒绝流程 */
class OnPermissionDeniedListenerImpl : OnPermissionDeniedListener {
    override fun onDenied(
        fragment: Fragment?,
        permissionArray: Array<out String>?,
        requestCode: Int,
        call: OnCallbackListener<Boolean>?
    ) {
        if (fragment == null || permissionArray == null || fragment.context == null) return
        // 这里即未获取到权限时,合格的流程这里应该询问用户是否需要前往设置打开,示例如下
        XXPermissions.startPermissionActivity(
            fragment,
            permissionArray.toCompatPermissions,
            object : OnPermissionPageCallback {
                override fun onGranted() {
                    call?.onCall(true)
                }

                override fun onDenied() {
                    ToastUtil.show("权限打开失败")
                    call?.onCall(false)
                }
            }
        )
    }
}

/** 具体的权限申请impl,在这里,我们对权限进行二次调整 */
class OnPermissionCallbackImpl(
    private val fragment: Fragment,
    private val permissionArray: Array<out String>,
    private val call: OnRequestPermissionListener?
) : OnPermissionCallback {

    override fun onGranted(permissions: MutableList<String>?, all: Boolean) {
        if (permissions == null) {
            call?.onCall(permissionArray, false)
            return
        }
        if (all) {
            call?.onCall(permissionArray, true)
        } else {
            // 此时直接return,因为我们知道这是用户自己操作的
            return
        }
    }

    override fun onDenied(permissions: MutableList<String>?, never: Boolean) {
        if (fragment.activity == null || permissions == null) return
        // 永久拒绝时让流程延续下去
        if (never) {
            call?.onCall(permissionArray, false)
        }
    }
}

private val Array<out String>.isFilePermission: Boolean
    get() = this.contains(Permission.WRITE_EXTERNAL_STORAGE) ||
        this.contains(Permission.READ_EXTERNAL_STORAGE)

private val Array<out String>.isCamera: Boolean
    get() = this.contains(Permission.CAMERA)

private val Array<out String>.toCompatPermissions: Array<out String>
    get() {
        if (isFilePermission) return arrayOf(Permission.READ_MEDIA_IMAGES)
        return this
    }

@Dokeyyw
Copy link

Dokeyyw commented Nov 2, 2022

着急的话,自己先处理下吧,这个框架已经写的很好了。自己拦截权限处理setPermissionsInterceptListener,然后将READ_EXTERNAL_STORAGE和WRITE替换为READ_MEDIA_IMAGE...即可,非常简单。

大佬们有没有遇到一个选择完图片压缩很长时间的情况,就是圈圈一直转在哪里,我也不知道问题是不是出在压缩图片这里,客户的手机好几个碰到这样的情况,找了下没找到问题,头疼。

@Petterpx
Copy link

Petterpx commented Nov 3, 2022

着急的话,自己先处理下吧,这个框架已经写的很好了。自己拦截权限处理setPermissionsInterceptListener,然后将READ_EXTERNAL_STORAGE和WRITE替换为READ_MEDIA_IMAGE...即可,非常简单。

大佬们有没有遇到一个选择完图片压缩很长时间的情况,就是圈圈一直转在哪里,我也不知道问题是不是出在压缩图片这里,客户的手机好几个碰到这样的情况,找了下没找到问题,头疼。

找客户要一下原图试试,看看是不是因为heif或者其他原因

@Dokeyyw
Copy link

Dokeyyw commented Nov 4, 2022 via email

@Dokeyyw
Copy link

Dokeyyw commented Nov 4, 2022 via email

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

6 participants