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,在13上无法使用,百分百必现啊 #2483

Closed
YuanDylan opened this issue Sep 9, 2022 · 10 comments
Closed

没有适配Android13,在13上无法使用,百分百必现啊 #2483

YuanDylan opened this issue Sep 9, 2022 · 10 comments

Comments

@YuanDylan
Copy link

Current use version?

当前使用的版本是3.10.6!

Will this problem occur in demo?

Demo可以复现这问题!

Describe the problem or provide an error log?

需要升级到13,13上面READ_EXTERNAL_STORAGE权限被拆分成READ_MEDIA_IMAGES,READ_MEDIA_VIDEO,READ_MEDIA_AUDIO三个权限了

@YuanDylan
Copy link
Author

YuanDylan commented Sep 24, 2022 via email

@renwavewave
Copy link

您好,您的邮件我已经收到了,谢谢!

怎么处理的?兄弟分享一下呀

@YuanDylan
Copy link
Author

YuanDylan commented Oct 12, 2022 via email

@LuckSiege
Copy link
Owner

可以尝试通过自定义权限适配一下

 .setPermissionsInterceptListener(new OnPermissionsInterceptListener() {
	@Override
	public void requestPermission(Fragment fragment, String[] permissionArray, OnRequestPermissionListener call) {
		
	}

	@Override
	public boolean hasPermissions(Fragment fragment, String[] permissionArray) {
		return false;
	}
})

@mlp1995
Copy link

mlp1995 commented Oct 25, 2022

Android 13 也就是权限问题可以尝试在打开相册之前先把权限获取到应该就就可以了吧

@YuanDylan
Copy link
Author

可以尝试通过自定义权限适配一下

 .setPermissionsInterceptListener(new OnPermissionsInterceptListener() {
	@Override
	public void requestPermission(Fragment fragment, String[] permissionArray, OnRequestPermissionListener call) {
		
	}

	@Override
	public boolean hasPermissions(Fragment fragment, String[] permissionArray) {
		return false;
	}
})

setPermissionsInterceptListener这个方法只能申请权限,但是到页面里面,还会有另外一个读写权限的检测,这会导致出现提示框。

@YuanDylan
Copy link
Author

您好,您的邮件我已经收到了,谢谢!

怎么处理的?兄弟分享一下呀

我是吧源码下载下来,重新修改了里面的权限申请,适配了Android13。

@YuanDylan
Copy link
Author

Android 13 也就是权限问题可以尝试在打开相册之前先把权限获取到应该就就可以了吧

页面内部有读写权限的判断,在android13上面已经没有了。这个外部怎么申请都处理不了

@Petterpx
Copy link

Android 13 也就是权限问题可以尝试在打开相册之前先把权限获取到应该就就可以了吧

页面内部有读写权限的判断,在android13上面已经没有了。这个外部怎么申请都处理不了

自己拦截权限处理即可,权限相关都走自己的方法,非常简单粗暴,也不用fork去改。作者的库写的很好了

@Petterpx
Copy link

如下所示,复制这个示例即可:

/** @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
    }

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

5 participants