feat:完成华为应用市场权限申请适配(增加提示)
This commit is contained in:
@@ -134,7 +134,7 @@ public abstract class BaseActivity extends RxAppCompatActivity
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
protected static final String STATUS_TAG = "STATUS_TAG";
|
protected static final String STATUS_TAG = "STATUS_TAG";
|
||||||
private final RxPermissions rxPermissions = new RxPermissions(this);
|
protected final RxPermissions rxPermissions = new RxPermissions(this);
|
||||||
protected TitleBar mTitleBar;
|
protected TitleBar mTitleBar;
|
||||||
protected DefaultToolBar mToolBar;
|
protected DefaultToolBar mToolBar;
|
||||||
protected CompositeDisposable mCompositeDisposable;
|
protected CompositeDisposable mCompositeDisposable;
|
||||||
|
@@ -0,0 +1,26 @@
|
|||||||
|
package com.nnbc123.app.common.permission
|
||||||
|
|
||||||
|
import com.tbruyelle.rxpermissions2.RxPermissions
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Created by Max on 2024/1/8 10:25
|
||||||
|
* Desc:
|
||||||
|
**/
|
||||||
|
object PermissionHelper {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 检查权限是否都授权
|
||||||
|
*/
|
||||||
|
fun isAllGender(rxPermissions: RxPermissions, vararg perms: String?): Boolean {
|
||||||
|
if (perms.firstOrNull {
|
||||||
|
if (it == null) {
|
||||||
|
false
|
||||||
|
} else {
|
||||||
|
!rxPermissions.isGranted(it)
|
||||||
|
}
|
||||||
|
} != null) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
@@ -5,12 +5,17 @@ import android.content.Context
|
|||||||
import android.content.Intent
|
import android.content.Intent
|
||||||
import android.net.Uri
|
import android.net.Uri
|
||||||
import android.provider.Settings
|
import android.provider.Settings
|
||||||
|
import androidx.fragment.app.FragmentActivity
|
||||||
|
import com.chuhai.utils.ktx.asActivity
|
||||||
import com.nnbc123.app.R
|
import com.nnbc123.app.R
|
||||||
|
import com.nnbc123.app.common.permission.PermissionHelper
|
||||||
import com.nnbc123.app.ui.widget.dialog.CommonTipDialog
|
import com.nnbc123.app.ui.widget.dialog.CommonTipDialog
|
||||||
|
import com.nnbc123.app.ui.widget.dialog.RequestPermissionPromptDialog
|
||||||
import com.nnbc123.library.utils.ResUtil
|
import com.nnbc123.library.utils.ResUtil
|
||||||
import com.qiyukf.unicorn.api.event.EventCallback
|
import com.qiyukf.unicorn.api.event.EventCallback
|
||||||
import com.qiyukf.unicorn.api.event.UnicornEventBase
|
import com.qiyukf.unicorn.api.event.UnicornEventBase
|
||||||
import com.qiyukf.unicorn.api.event.entry.RequestPermissionEventEntry
|
import com.qiyukf.unicorn.api.event.entry.RequestPermissionEventEntry
|
||||||
|
import com.tbruyelle.rxpermissions2.RxPermissions
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Created by Max on 2024/1/4 11:10
|
* Created by Max on 2024/1/4 11:10
|
||||||
@@ -22,18 +27,60 @@ class RequestPermissionEvent : UnicornEventBase<RequestPermissionEventEntry> {
|
|||||||
p1: Context?,
|
p1: Context?,
|
||||||
p2: EventCallback<RequestPermissionEventEntry>?
|
p2: EventCallback<RequestPermissionEventEntry>?
|
||||||
) {
|
) {
|
||||||
p2?.onNotPorcessEvent()
|
val tips = getPermissionTips(p0?.scenesType)
|
||||||
|
val activity = (p1?.asActivity() as? FragmentActivity)
|
||||||
|
val perms = p0?.permissionList?.toTypedArray()
|
||||||
|
if (RequestPermissionPromptDialog.isNeedPrompt()
|
||||||
|
&& tips != null
|
||||||
|
&& activity != null
|
||||||
|
&& perms != null
|
||||||
|
) {
|
||||||
|
val rxPermissions = RxPermissions(activity)
|
||||||
|
if (PermissionHelper.isAllGender(rxPermissions, * perms)) {
|
||||||
|
p2?.onNotPorcessEvent()
|
||||||
|
} else {
|
||||||
|
RequestPermissionPromptDialog(p1, tips).show()
|
||||||
|
val d = rxPermissions.request(*perms).subscribe({ aBoolean: Boolean? ->
|
||||||
|
RequestPermissionPromptDialog.dismissCurrentDialog()
|
||||||
|
if (aBoolean == true) {
|
||||||
|
p2?.onProcessEventSuccess(p0)
|
||||||
|
} else {
|
||||||
|
showDeniedTips(p1, tips)
|
||||||
|
p2?.onInterceptEvent()
|
||||||
|
}
|
||||||
|
}) { obj: Throwable ->
|
||||||
|
RequestPermissionPromptDialog.dismissCurrentDialog()
|
||||||
|
obj.printStackTrace()
|
||||||
|
p2?.onNotPorcessEvent()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
p2?.onNotPorcessEvent()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onDenyEvent(p0: Context?, p1: RequestPermissionEventEntry?): Boolean {
|
override fun onDenyEvent(p0: Context?, p1: RequestPermissionEventEntry?): Boolean {
|
||||||
if (p0 == null) {
|
if (p0 == null) {
|
||||||
return super.onDenyEvent(p0, p1)
|
return super.onDenyEvent(p0, p1)
|
||||||
}
|
}
|
||||||
when (p1?.scenesType) {
|
val tips = getPermissionTips(p1?.scenesType)
|
||||||
|
return if (tips != null) {
|
||||||
|
showDeniedTips(p0, tips)
|
||||||
|
true
|
||||||
|
} else {
|
||||||
|
super.onDenyEvent(p0, p1)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取场景对应的权限提示信息(不需要提示的权限返回null)
|
||||||
|
*/
|
||||||
|
private fun getPermissionTips(scenesType: Int?): String? {
|
||||||
|
when (scenesType) {
|
||||||
RequestPermissionEventEntry.SCENES_TAKE_AUDIO -> {
|
RequestPermissionEventEntry.SCENES_TAKE_AUDIO -> {
|
||||||
showDeniedTips(p0, ResUtil.getString(R.string.permission_denied_tips_mic))
|
return ResUtil.getString(R.string.permission_denied_tips_mic)
|
||||||
return true
|
|
||||||
}
|
}
|
||||||
|
|
||||||
RequestPermissionEventEntry.SCENES_SELECT_MEDIA,
|
RequestPermissionEventEntry.SCENES_SELECT_MEDIA,
|
||||||
RequestPermissionEventEntry.SCENES_TAKE_VIDEO,
|
RequestPermissionEventEntry.SCENES_TAKE_VIDEO,
|
||||||
RequestPermissionEventEntry.SCENES_SAVE_IMAGE,
|
RequestPermissionEventEntry.SCENES_SAVE_IMAGE,
|
||||||
@@ -43,12 +90,11 @@ class RequestPermissionEvent : UnicornEventBase<RequestPermissionEventEntry> {
|
|||||||
RequestPermissionEventEntry.SCENES_SELECT_IMAGE,
|
RequestPermissionEventEntry.SCENES_SELECT_IMAGE,
|
||||||
RequestPermissionEventEntry.SCENES_TAKE_PHOTO,
|
RequestPermissionEventEntry.SCENES_TAKE_PHOTO,
|
||||||
RequestPermissionEventEntry.SCENES_VIDEO_CHAT -> {
|
RequestPermissionEventEntry.SCENES_VIDEO_CHAT -> {
|
||||||
showDeniedTips(p0, ResUtil.getString(R.string.permission_denied_tips_image))
|
return ResUtil.getString(R.string.permission_denied_tips_image)
|
||||||
return true
|
|
||||||
}
|
}
|
||||||
|
|
||||||
else -> {
|
else -> {
|
||||||
return super.onDenyEvent(p0, p1)
|
return null
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -2,6 +2,7 @@ package com.nnbc123.app.ui.im.fragment;
|
|||||||
|
|
||||||
import android.Manifest;
|
import android.Manifest;
|
||||||
import android.annotation.SuppressLint;
|
import android.annotation.SuppressLint;
|
||||||
|
import android.content.Context;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.graphics.Color;
|
import android.graphics.Color;
|
||||||
import android.media.AudioManager;
|
import android.media.AudioManager;
|
||||||
@@ -54,6 +55,7 @@ import com.netease.nimlib.sdk.robot.model.NimRobotInfo;
|
|||||||
import com.netease.nimlib.sdk.robot.model.RobotAttachment;
|
import com.netease.nimlib.sdk.robot.model.RobotAttachment;
|
||||||
import com.netease.nimlib.sdk.robot.model.RobotMsgType;
|
import com.netease.nimlib.sdk.robot.model.RobotMsgType;
|
||||||
import com.nnbc123.app.R;
|
import com.nnbc123.app.R;
|
||||||
|
import com.nnbc123.app.common.permission.PermissionHelper;
|
||||||
import com.nnbc123.app.common.widget.OriginalDrawStatusClickSpan;
|
import com.nnbc123.app.common.widget.OriginalDrawStatusClickSpan;
|
||||||
import com.nnbc123.app.ui.im.GreetPresenter;
|
import com.nnbc123.app.ui.im.GreetPresenter;
|
||||||
import com.nnbc123.app.ui.im.MessageListPanelEx;
|
import com.nnbc123.app.ui.im.MessageListPanelEx;
|
||||||
@@ -61,6 +63,7 @@ import com.nnbc123.app.ui.im.chat.MVHChatterBoxStart;
|
|||||||
import com.nnbc123.app.ui.im.model.IMCustomModel;
|
import com.nnbc123.app.ui.im.model.IMCustomModel;
|
||||||
import com.nnbc123.app.ui.webview.CommonWebViewActivity;
|
import com.nnbc123.app.ui.webview.CommonWebViewActivity;
|
||||||
import com.nnbc123.app.ui.widget.dialog.CommonTipDialog;
|
import com.nnbc123.app.ui.widget.dialog.CommonTipDialog;
|
||||||
|
import com.nnbc123.app.ui.widget.dialog.RequestPermissionPromptDialog;
|
||||||
import com.nnbc123.app.utils.PushMessageHandler;
|
import com.nnbc123.app.utils.PushMessageHandler;
|
||||||
import com.nnbc123.core.UriProvider;
|
import com.nnbc123.core.UriProvider;
|
||||||
import com.nnbc123.core.auth.AuthModel;
|
import com.nnbc123.core.auth.AuthModel;
|
||||||
@@ -230,7 +233,7 @@ public class MessageFragment extends TFragment implements ModuleProxy, MessageLi
|
|||||||
IMMessage anchor = (IMMessage) getArguments().getSerializable(Extras.EXTRA_ANCHOR);
|
IMMessage anchor = (IMMessage) getArguments().getSerializable(Extras.EXTRA_ANCHOR);
|
||||||
|
|
||||||
customization = (SessionCustomization) getArguments().getSerializable(Extras.EXTRA_CUSTOMIZATION);
|
customization = (SessionCustomization) getArguments().getSerializable(Extras.EXTRA_CUSTOMIZATION);
|
||||||
Container container = new Container(getActivity(), sessionId, sessionType, this,this::requestPermission);
|
Container container = new Container(getActivity(), sessionId, sessionType, this, this::requestPermission);
|
||||||
|
|
||||||
if (messageListPanel == null) {
|
if (messageListPanel == null) {
|
||||||
messageListPanel = new MessageListPanelEx(container, rootView, anchor, false, false);
|
messageListPanel = new MessageListPanelEx(container, rootView, anchor, false, false);
|
||||||
@@ -321,10 +324,16 @@ public class MessageFragment extends TFragment implements ModuleProxy, MessageLi
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void requestPermission(Consumer<Boolean> consumer, String deniedTips, String... perms) {
|
private void requestPermission(Consumer<Boolean> consumer, String tips, String... perms) {
|
||||||
|
Context context = getContext();
|
||||||
|
if (context != null && RequestPermissionPromptDialog.Companion.isNeedPrompt()
|
||||||
|
&& !PermissionHelper.INSTANCE.isAllGender(rxPermissions, perms)) {
|
||||||
|
new RequestPermissionPromptDialog(context, tips).show();
|
||||||
|
}
|
||||||
Disposable disposable = rxPermissions.request(perms).subscribe(aBoolean -> {
|
Disposable disposable = rxPermissions.request(perms).subscribe(aBoolean -> {
|
||||||
|
RequestPermissionPromptDialog.Companion.dismissCurrentDialog();
|
||||||
if (!aBoolean) {
|
if (!aBoolean) {
|
||||||
showPermissionDeniedTipsDialog(deniedTips);
|
showPermissionDeniedTipsDialog(tips);
|
||||||
}
|
}
|
||||||
if (consumer != null) {
|
if (consumer != null) {
|
||||||
consumer.accept(aBoolean);
|
consumer.accept(aBoolean);
|
||||||
@@ -616,19 +625,26 @@ public class MessageFragment extends TFragment implements ModuleProxy, MessageLi
|
|||||||
@Subscribe(threadMode = ThreadMode.MAIN)
|
@Subscribe(threadMode = ThreadMode.MAIN)
|
||||||
@SuppressLint("CheckResult")
|
@SuppressLint("CheckResult")
|
||||||
public void onNimAudioChatEvent(NimAudioChatEvent event) {
|
public void onNimAudioChatEvent(NimAudioChatEvent event) {
|
||||||
checkPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE,
|
String[] perms = new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE,
|
||||||
Manifest.permission.READ_EXTERNAL_STORAGE,
|
Manifest.permission.READ_EXTERNAL_STORAGE,
|
||||||
Manifest.permission.RECORD_AUDIO)
|
Manifest.permission.RECORD_AUDIO};
|
||||||
|
String tips = ResUtil.getString(R.string.permission_denied_tips_mic);
|
||||||
|
if (RequestPermissionPromptDialog.Companion.isNeedPrompt()
|
||||||
|
&& !PermissionHelper.INSTANCE.isAllGender(rxPermissions, perms)) {
|
||||||
|
new RequestPermissionPromptDialog(requireContext(), tips).show();
|
||||||
|
}
|
||||||
|
checkPermission(perms)
|
||||||
.subscribe(result -> {
|
.subscribe(result -> {
|
||||||
|
RequestPermissionPromptDialog.Companion.dismissCurrentDialog();
|
||||||
if (result) {
|
if (result) {
|
||||||
event.getSuccess().accept(result);
|
event.getSuccess().accept(result);
|
||||||
} else {
|
} else {
|
||||||
showPermissionDeniedTipsDialog(ResUtil.getString(R.string.permission_denied_tips_mic));
|
showPermissionDeniedTipsDialog(tips);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
private void showPermissionDeniedTipsDialog(String message){
|
private void showPermissionDeniedTipsDialog(String message) {
|
||||||
CommonTipDialog mPrivacyDialog = new CommonTipDialog(getContext());
|
CommonTipDialog mPrivacyDialog = new CommonTipDialog(getContext());
|
||||||
mPrivacyDialog.setTipMsg(message);
|
mPrivacyDialog.setTipMsg(message);
|
||||||
mPrivacyDialog.setOkText("去设置");
|
mPrivacyDialog.setOkText("去设置");
|
||||||
|
@@ -28,6 +28,7 @@ import com.nnbc123.app.ui.login.ModifyInfoActivity
|
|||||||
import com.nnbc123.app.ui.user.UserPhotoAdapter.ImageClickListener
|
import com.nnbc123.app.ui.user.UserPhotoAdapter.ImageClickListener
|
||||||
import com.nnbc123.app.ui.utils.ImageLoadUtils
|
import com.nnbc123.app.ui.utils.ImageLoadUtils
|
||||||
import com.nnbc123.app.ui.widget.dialog.CommonTipDialog
|
import com.nnbc123.app.ui.widget.dialog.CommonTipDialog
|
||||||
|
import com.nnbc123.app.ui.widget.dialog.RequestPermissionPromptDialog
|
||||||
import com.nnbc123.app.utils.RegexUtil
|
import com.nnbc123.app.utils.RegexUtil
|
||||||
import com.nnbc123.core.auth.AuthModel
|
import com.nnbc123.core.auth.AuthModel
|
||||||
import com.nnbc123.core.file.FileModel
|
import com.nnbc123.core.file.FileModel
|
||||||
@@ -40,6 +41,7 @@ import com.nnbc123.library.common.photo.PhotoProviderNew
|
|||||||
import com.nnbc123.library.common.util.PhotoCompressCallback
|
import com.nnbc123.library.common.util.PhotoCompressCallback
|
||||||
import com.nnbc123.library.common.util.PhotoCompressUtil
|
import com.nnbc123.library.common.util.PhotoCompressUtil
|
||||||
import com.nnbc123.library.easypermisssion.EasyPermissions
|
import com.nnbc123.library.easypermisssion.EasyPermissions
|
||||||
|
import com.nnbc123.library.utils.ResUtil
|
||||||
import com.nnbc123.library.utils.TimeUtils
|
import com.nnbc123.library.utils.TimeUtils
|
||||||
import com.sleepbot.datetimepicker.time.RadialPickerLayout
|
import com.sleepbot.datetimepicker.time.RadialPickerLayout
|
||||||
import com.sleepbot.datetimepicker.time.TimePickerDialog
|
import com.sleepbot.datetimepicker.time.TimePickerDialog
|
||||||
@@ -276,6 +278,7 @@ class UserInfoModifyActivity : BaseViewBindingActivity<ActivityUserInfoModifyBin
|
|||||||
|
|
||||||
override fun onPermissionsDenied(requestCode: Int, perms: MutableList<String>) {
|
override fun onPermissionsDenied(requestCode: Int, perms: MutableList<String>) {
|
||||||
if (requestCode == PERMISSION_CODE_STORAGE) {
|
if (requestCode == PERMISSION_CODE_STORAGE) {
|
||||||
|
RequestPermissionPromptDialog.dismissCurrentDialog()
|
||||||
val requestTip = "为了能正常加载您本地的文件内容,请前往应用权限设置界面打开存储空间权限。"
|
val requestTip = "为了能正常加载您本地的文件内容,请前往应用权限设置界面打开存储空间权限。"
|
||||||
val mPrivacyDialog = CommonTipDialog(context)
|
val mPrivacyDialog = CommonTipDialog(context)
|
||||||
mPrivacyDialog.setTipMsg(requestTip)
|
mPrivacyDialog.setTipMsg(requestTip)
|
||||||
@@ -307,12 +310,19 @@ class UserInfoModifyActivity : BaseViewBindingActivity<ActivityUserInfoModifyBin
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun checkStoragePermission() {
|
private fun checkStoragePermission() {
|
||||||
|
RequestPermissionPromptDialog.dismissCurrentDialog()
|
||||||
if (!EasyPermissions.hasPermissions(
|
if (!EasyPermissions.hasPermissions(
|
||||||
this,
|
this,
|
||||||
Manifest.permission.WRITE_EXTERNAL_STORAGE,
|
Manifest.permission.WRITE_EXTERNAL_STORAGE,
|
||||||
Manifest.permission.READ_EXTERNAL_STORAGE
|
Manifest.permission.READ_EXTERNAL_STORAGE
|
||||||
)
|
)
|
||||||
) {
|
) {
|
||||||
|
if (RequestPermissionPromptDialog.isNeedPrompt()) {
|
||||||
|
RequestPermissionPromptDialog(
|
||||||
|
this,
|
||||||
|
ResUtil.getString(R.string.permission_denied_tips_image)
|
||||||
|
).show()
|
||||||
|
}
|
||||||
EasyPermissions.requestPermissions(
|
EasyPermissions.requestPermissions(
|
||||||
this,
|
this,
|
||||||
"请您再次考虑授予存储空间权限,否则将无法正常加载您本地的文件内容。",
|
"请您再次考虑授予存储空间权限,否则将无法正常加载您本地的文件内容。",
|
||||||
|
@@ -28,6 +28,7 @@ import com.nnbc123.app.takephoto.compress.CompressConfig
|
|||||||
import com.nnbc123.app.ui.user.UserModifyPhotosAdapter.PhotoItemClickListener
|
import com.nnbc123.app.ui.user.UserModifyPhotosAdapter.PhotoItemClickListener
|
||||||
import com.nnbc123.app.ui.utils.ImageLoadUtils
|
import com.nnbc123.app.ui.utils.ImageLoadUtils
|
||||||
import com.nnbc123.app.ui.widget.dialog.CommonTipDialog
|
import com.nnbc123.app.ui.widget.dialog.CommonTipDialog
|
||||||
|
import com.nnbc123.app.ui.widget.dialog.RequestPermissionPromptDialog
|
||||||
import com.nnbc123.app.utils.RegexUtil
|
import com.nnbc123.app.utils.RegexUtil
|
||||||
import com.nnbc123.core.file.FileModel
|
import com.nnbc123.core.file.FileModel
|
||||||
import com.nnbc123.core.user.UserModel
|
import com.nnbc123.core.user.UserModel
|
||||||
@@ -39,6 +40,7 @@ import com.nnbc123.library.common.photo.PhotoProviderNew
|
|||||||
import com.nnbc123.library.common.util.PhotoCompressCallback
|
import com.nnbc123.library.common.util.PhotoCompressCallback
|
||||||
import com.nnbc123.library.common.util.PhotoCompressUtil
|
import com.nnbc123.library.common.util.PhotoCompressUtil
|
||||||
import com.nnbc123.library.easypermisssion.EasyPermissions
|
import com.nnbc123.library.easypermisssion.EasyPermissions
|
||||||
|
import com.nnbc123.library.utils.ResUtil
|
||||||
import com.nnbc123.library.utils.file.JXFileUtils
|
import com.nnbc123.library.utils.file.JXFileUtils
|
||||||
import com.orhanobut.logger.Logger
|
import com.orhanobut.logger.Logger
|
||||||
import com.trello.rxlifecycle3.android.ActivityEvent
|
import com.trello.rxlifecycle3.android.ActivityEvent
|
||||||
@@ -225,6 +227,7 @@ class UserModifyPhotosActivity : TakePhotoActivity(), PhotoItemClickListener,
|
|||||||
|
|
||||||
override fun onPermissionsDenied(requestCode: Int, perms: MutableList<String>) {
|
override fun onPermissionsDenied(requestCode: Int, perms: MutableList<String>) {
|
||||||
if (requestCode == PERMISSION_CODE_STORAGE) {
|
if (requestCode == PERMISSION_CODE_STORAGE) {
|
||||||
|
RequestPermissionPromptDialog.dismissCurrentDialog()
|
||||||
val requestTip = "为了能正常加载您本地的文件内容,请前往应用权限设置界面打开存储空间权限。"
|
val requestTip = "为了能正常加载您本地的文件内容,请前往应用权限设置界面打开存储空间权限。"
|
||||||
val mPrivacyDialog = CommonTipDialog(context)
|
val mPrivacyDialog = CommonTipDialog(context)
|
||||||
mPrivacyDialog.setTipMsg(requestTip)
|
mPrivacyDialog.setTipMsg(requestTip)
|
||||||
@@ -256,12 +259,19 @@ class UserModifyPhotosActivity : TakePhotoActivity(), PhotoItemClickListener,
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun checkStoragePermission() {
|
private fun checkStoragePermission() {
|
||||||
|
RequestPermissionPromptDialog.dismissCurrentDialog()
|
||||||
if (!EasyPermissions.hasPermissions(
|
if (!EasyPermissions.hasPermissions(
|
||||||
this,
|
this,
|
||||||
Manifest.permission.WRITE_EXTERNAL_STORAGE,
|
Manifest.permission.WRITE_EXTERNAL_STORAGE,
|
||||||
Manifest.permission.READ_EXTERNAL_STORAGE
|
Manifest.permission.READ_EXTERNAL_STORAGE
|
||||||
)
|
)
|
||||||
) {
|
) {
|
||||||
|
if (RequestPermissionPromptDialog.isNeedPrompt()) {
|
||||||
|
RequestPermissionPromptDialog(
|
||||||
|
this,
|
||||||
|
ResUtil.getString(R.string.permission_denied_tips_image)
|
||||||
|
).show()
|
||||||
|
}
|
||||||
EasyPermissions.requestPermissions(
|
EasyPermissions.requestPermissions(
|
||||||
this,
|
this,
|
||||||
"请您再次考虑授予存储空间权限,否则将无法正常加载您本地的文件内容。",
|
"请您再次考虑授予存储空间权限,否则将无法正常加载您本地的文件内容。",
|
||||||
|
@@ -0,0 +1,70 @@
|
|||||||
|
package com.nnbc123.app.ui.widget.dialog
|
||||||
|
|
||||||
|
import android.app.Dialog
|
||||||
|
import android.content.Context
|
||||||
|
import android.os.Bundle
|
||||||
|
import android.view.Gravity
|
||||||
|
import android.view.View
|
||||||
|
import android.view.WindowManager
|
||||||
|
import android.widget.TextView
|
||||||
|
import androidx.lifecycle.Lifecycle
|
||||||
|
import androidx.lifecycle.LifecycleEventObserver
|
||||||
|
import androidx.lifecycle.LifecycleOwner
|
||||||
|
import com.nnbc123.app.R
|
||||||
|
import com.nnbc123.library.utils.config.BasicConfig
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Created by Max on 2024/1/8 10:06
|
||||||
|
* Desc:申请权限提示
|
||||||
|
**/
|
||||||
|
class RequestPermissionPromptDialog(context: Context, private val message: String) :
|
||||||
|
Dialog(context, R.style.dialog_full_width), LifecycleEventObserver {
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
private var currentDialog: RequestPermissionPromptDialog? = null
|
||||||
|
fun dismissCurrentDialog() {
|
||||||
|
currentDialog?.dismiss()
|
||||||
|
currentDialog = null
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 是否需要展示权限申请说明
|
||||||
|
*/
|
||||||
|
fun isNeedPrompt(): Boolean {
|
||||||
|
return (BasicConfig.INSTANCE.channel == "huawei")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
|
super.onCreate(savedInstanceState)
|
||||||
|
currentDialog = this
|
||||||
|
val window = window
|
||||||
|
if (window != null) {
|
||||||
|
val lps = window.attributes
|
||||||
|
lps.gravity = Gravity.TOP
|
||||||
|
lps.verticalMargin = 0f
|
||||||
|
lps.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
|
||||||
|
window.attributes = lps
|
||||||
|
}
|
||||||
|
setCanceledOnTouchOutside(false)
|
||||||
|
setContentView(R.layout.dialog_request_permission_prompt)
|
||||||
|
val rootView = findViewById<View>(R.id.layout_root)
|
||||||
|
// 权限已被拒时再申请权限会立即回调结果,这个弹窗看起来闪一下就没了,优化这个体验:延迟可见
|
||||||
|
rootView?.animate()?.alpha(1f)?.setStartDelay(200)?.start()
|
||||||
|
val messageView = findViewById<TextView>(R.id.tv_message)
|
||||||
|
messageView?.text = message
|
||||||
|
(ownerActivity as? LifecycleOwner)?.lifecycle?.addObserver(this)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun dismiss() {
|
||||||
|
currentDialog = null
|
||||||
|
(ownerActivity as? LifecycleOwner)?.lifecycle?.removeObserver(this)
|
||||||
|
super.dismiss()
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onStateChanged(source: LifecycleOwner, event: Lifecycle.Event) {
|
||||||
|
if (event == Lifecycle.Event.ON_DESTROY) {
|
||||||
|
this@RequestPermissionPromptDialog.dismiss()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
35
app/src/main/res/layout/dialog_request_permission_prompt.xml
Normal file
35
app/src/main/res/layout/dialog_request_permission_prompt.xml
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
|
android:id="@+id/layout_root"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginHorizontal="8dp"
|
||||||
|
android:layout_marginTop="5dp"
|
||||||
|
android:alpha="0"
|
||||||
|
android:background="@drawable/shape_white_8dp_round"
|
||||||
|
android:paddingHorizontal="28dp"
|
||||||
|
android:paddingVertical="14dp">
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/tv_title"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:text="权限使用说明:"
|
||||||
|
android:textColor="#2B2D33"
|
||||||
|
android:textSize="14sp"
|
||||||
|
android:textStyle="bold"
|
||||||
|
app:layout_constraintTop_toTopOf="parent" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/tv_message"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginTop="1dp"
|
||||||
|
android:textColor="#696D7A"
|
||||||
|
android:textSize="14sp"
|
||||||
|
app:layout_constraintTop_toBottomOf="@id/tv_title"
|
||||||
|
tools:text="MESSAGEMESSA" />
|
||||||
|
|
||||||
|
</androidx.constraintlayout.widget.ConstraintLayout>
|
@@ -125,6 +125,19 @@
|
|||||||
<item name="android:backgroundDimAmount">0.5</item>
|
<item name="android:backgroundDimAmount">0.5</item>
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
|
<style name="dialog_full_width" parent="android:Theme.Dialog">
|
||||||
|
<item name="android:windowFrame">@null</item>
|
||||||
|
<item name="android:windowIsFloating">true</item>
|
||||||
|
<item name="android:windowIsTranslucent">true</item>
|
||||||
|
<item name="windowActionBar">false</item>
|
||||||
|
<item name="android:windowNoTitle">true</item>
|
||||||
|
<item name="android:background">@android:color/transparent</item>
|
||||||
|
<item name="android:windowBackground">@android:color/transparent</item>
|
||||||
|
<item name="android:backgroundDimEnabled">false</item>
|
||||||
|
<item name="android:windowMinWidthMajor">100%</item>
|
||||||
|
<item name="android:windowMinWidthMinor">100%</item>
|
||||||
|
</style>
|
||||||
|
|
||||||
<style name="top_dialog" parent="Theme.AppCompat.Dialog">
|
<style name="top_dialog" parent="Theme.AppCompat.Dialog">
|
||||||
<item name="android:windowIsFloating">false</item>
|
<item name="android:windowIsFloating">false</item>
|
||||||
<item name="windowActionBar">false</item>
|
<item name="windowActionBar">false</item>
|
||||||
|
@@ -26,7 +26,9 @@ import com.google.android.flexbox.FlexboxLayout;
|
|||||||
import com.hjq.toast.ToastUtils;
|
import com.hjq.toast.ToastUtils;
|
||||||
import com.netease.nim.uikit.StatusBarUtil;
|
import com.netease.nim.uikit.StatusBarUtil;
|
||||||
import com.netease.nim.uikit.common.util.log.LogUtil;
|
import com.netease.nim.uikit.common.util.log.LogUtil;
|
||||||
|
import com.nnbc123.app.common.permission.PermissionHelper;
|
||||||
import com.nnbc123.app.ui.widget.dialog.CommonTipDialog;
|
import com.nnbc123.app.ui.widget.dialog.CommonTipDialog;
|
||||||
|
import com.nnbc123.app.ui.widget.dialog.RequestPermissionPromptDialog;
|
||||||
import com.nnbc123.library.utils.ResUtil;
|
import com.nnbc123.library.utils.ResUtil;
|
||||||
import com.trello.rxlifecycle3.android.ActivityEvent;
|
import com.trello.rxlifecycle3.android.ActivityEvent;
|
||||||
import com.nnbc123.app.R;
|
import com.nnbc123.app.R;
|
||||||
@@ -196,7 +198,14 @@ public class PublishActivity extends BaseMvpActivity<IPublishView, PublishPresen
|
|||||||
imageAdapter.setOnItemClickListener((adapter, view, position) -> {
|
imageAdapter.setOnItemClickListener((adapter, view, position) -> {
|
||||||
PublishItem item = imageShowList.get(position);
|
PublishItem item = imageShowList.get(position);
|
||||||
if (item.isAddItem()) {
|
if (item.isAddItem()) {
|
||||||
|
String tips = ResUtil.getString(R.string.permission_denied_tips_image);
|
||||||
|
String permission = Manifest.permission.READ_EXTERNAL_STORAGE;
|
||||||
|
if (RequestPermissionPromptDialog.Companion.isNeedPrompt()
|
||||||
|
&& !PermissionHelper.INSTANCE.isAllGender(rxPermissions, permission)) {
|
||||||
|
new RequestPermissionPromptDialog(this, tips).show();
|
||||||
|
}
|
||||||
checkPermission((aBoolean) -> {
|
checkPermission((aBoolean) -> {
|
||||||
|
RequestPermissionPromptDialog.Companion.dismissCurrentDialog();
|
||||||
if (aBoolean) {
|
if (aBoolean) {
|
||||||
CaptureStrategy captureStrategy = new CaptureStrategy(true, context.getPackageName() + ".fileprovider",
|
CaptureStrategy captureStrategy = new CaptureStrategy(true, context.getPackageName() + ".fileprovider",
|
||||||
BasicConfig.INSTANCE.getImageDir().getAbsolutePath());
|
BasicConfig.INSTANCE.getImageDir().getAbsolutePath());
|
||||||
@@ -216,9 +225,9 @@ public class PublishActivity extends BaseMvpActivity<IPublishView, PublishPresen
|
|||||||
.setOriginalImagee(isOriginalImage)
|
.setOriginalImagee(isOriginalImage)
|
||||||
.forResult(ConstantValue.CODE_CHOOSE_PHOTO);
|
.forResult(ConstantValue.CODE_CHOOSE_PHOTO);
|
||||||
} else {
|
} else {
|
||||||
showPermissionDeniedDialog();
|
showPermissionDeniedDialog(tips);
|
||||||
}
|
}
|
||||||
}, Manifest.permission.READ_EXTERNAL_STORAGE);
|
}, permission);
|
||||||
} else {
|
} else {
|
||||||
BigPhotoActivity.startCanDelete(PublishActivity.this, (ArrayList<CustomItem>) uploadList,
|
BigPhotoActivity.startCanDelete(PublishActivity.this, (ArrayList<CustomItem>) uploadList,
|
||||||
position, new PagerOption().setDelete(true));
|
position, new PagerOption().setDelete(true));
|
||||||
@@ -238,9 +247,9 @@ public class PublishActivity extends BaseMvpActivity<IPublishView, PublishPresen
|
|||||||
updateImagesData();
|
updateImagesData();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void showPermissionDeniedDialog(){
|
private void showPermissionDeniedDialog(String tips){
|
||||||
CommonTipDialog mPrivacyDialog = new CommonTipDialog(context);
|
CommonTipDialog mPrivacyDialog = new CommonTipDialog(context);
|
||||||
mPrivacyDialog.setTipMsg(ResUtil.getString(R.string.permission_denied_tips_image));
|
mPrivacyDialog.setTipMsg(tips);
|
||||||
mPrivacyDialog.setOkText("去设置");
|
mPrivacyDialog.setOkText("去设置");
|
||||||
mPrivacyDialog.setOnActionListener(
|
mPrivacyDialog.setOnActionListener(
|
||||||
new CommonTipDialog.OnActionListener() {
|
new CommonTipDialog.OnActionListener() {
|
||||||
|
@@ -13,5 +13,5 @@ interface PermissionProxy {
|
|||||||
* @param consumer
|
* @param consumer
|
||||||
* @param perms 权限列表
|
* @param perms 权限列表
|
||||||
*/
|
*/
|
||||||
fun requestPermission(consumer: Consumer<Boolean>, deniedTips: String, vararg perms: String)
|
fun requestPermission(consumer: Consumer<Boolean>, tips: String, vararg perms: String)
|
||||||
}
|
}
|
Reference in New Issue
Block a user