feat:完善部分场景的权限拒绝提示

This commit is contained in:
Max
2024-01-04 12:14:34 +08:00
parent ecd6b8da81
commit d300ef179d
6 changed files with 202 additions and 24 deletions

View File

@@ -3,13 +3,16 @@ package com.nnbc123.app.avroom.fragment
import android.Manifest import android.Manifest
import android.annotation.SuppressLint import android.annotation.SuppressLint
import android.app.Activity import android.app.Activity
import android.content.Context
import android.content.DialogInterface import android.content.DialogInterface
import android.content.Intent import android.content.Intent
import android.content.pm.PackageManager import android.content.pm.PackageManager
import android.graphics.Color import android.graphics.Color
import android.graphics.drawable.Drawable import android.graphics.drawable.Drawable
import android.graphics.drawable.GradientDrawable import android.graphics.drawable.GradientDrawable
import android.net.Uri
import android.os.Bundle import android.os.Bundle
import android.provider.Settings
import android.text.TextUtils import android.text.TextUtils
import android.text.style.ForegroundColorSpan import android.text.style.ForegroundColorSpan
import android.view.* import android.view.*
@@ -115,6 +118,7 @@ import com.netease.nimlib.sdk.chatroom.ChatRoomMessageBuilder
import com.netease.nimlib.sdk.chatroom.model.ChatRoomKickOutEvent import com.netease.nimlib.sdk.chatroom.model.ChatRoomKickOutEvent
import com.netease.nimlib.sdk.chatroom.model.ChatRoomMessage import com.netease.nimlib.sdk.chatroom.model.ChatRoomMessage
import com.nnbc123.app.avroom.hour_rank.RoomHourRankWidget import com.nnbc123.app.avroom.hour_rank.RoomHourRankWidget
import com.nnbc123.app.ui.widget.dialog.CommonTipDialog
import com.orhanobut.logger.Logger import com.orhanobut.logger.Logger
import com.tbruyelle.rxpermissions2.RxPermissions import com.tbruyelle.rxpermissions2.RxPermissions
import com.trello.rxlifecycle3.android.FragmentEvent import com.trello.rxlifecycle3.android.FragmentEvent
@@ -1146,11 +1150,37 @@ open class BaseRoomFragment<V : IBaseRoomView?, P : BaseRoomPresenter<V>?> :
if (result) { if (result) {
mvpPresenter?.upMicroPhone(micPosition, currentUid, b) mvpPresenter?.upMicroPhone(micPosition, currentUid, b)
} else { } else {
toast("请给予麦克风权限后再试!") showDeniedTips(
requireContext(),
"为了实现连麦及语音输入等功能,请您允许应用向您获取“麦克风”权限"
)
} }
}, { throwable: Throwable? -> toast("发生一些异常,请稍后重试!") }) }, { throwable: Throwable? -> toast("发生一些异常,请稍后重试!") })
} }
private fun showDeniedTips(context: Context, message: String) {
CommonTipDialog(context).apply {
setTipMsg(message)
setOkText("去设置")
setOnActionListener(
object : CommonTipDialog.OnActionListener {
override fun onOk() {
//同意跳到应用详情页面
val packageUri =
Uri.parse("package:${context.packageName}")
val intent = Intent(
Settings.ACTION_APPLICATION_DETAILS_SETTINGS,
packageUri
)
(context as? Activity)?.startActivityForResult(
intent, 0
)
}
}
)
}.show()
}
/** /**
* 是否有麦克风权限 * 是否有麦克风权限
* *

View File

@@ -114,6 +114,7 @@ import java.lang.reflect.Field;
import java.lang.reflect.Method; import java.lang.reflect.Method;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.function.Consumer;
import io.reactivex.Observable; import io.reactivex.Observable;
import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.android.schedulers.AndroidSchedulers;
@@ -821,6 +822,17 @@ public abstract class BaseActivity extends RxAppCompatActivity
}, Throwable::printStackTrace); }, Throwable::printStackTrace);
} }
@SuppressLint("CheckResult")
public void checkPermission(Consumer<Boolean> consumer, String... mPerms) {
rxPermissions.request(mPerms)
.subscribe(aBoolean -> {
if (consumer != null) {
consumer.accept(aBoolean);
}
}, Throwable::printStackTrace);
}
@SuppressLint("CheckResult") @SuppressLint("CheckResult")
public Observable<Boolean> checkPermission(String... mPerms) { public Observable<Boolean> checkPermission(String... mPerms) {
return rxPermissions.request(mPerms); return rxPermissions.request(mPerms);

View File

@@ -21,6 +21,11 @@ import com.qiyukf.unicorn.api.YSFOptions;
import com.qiyukf.unicorn.api.YSFUserInfo; import com.qiyukf.unicorn.api.YSFUserInfo;
import com.qiyukf.unicorn.api.customization.input.ActionPanelOptions; import com.qiyukf.unicorn.api.customization.input.ActionPanelOptions;
import com.qiyukf.unicorn.api.customization.input.InputPanelOptions; import com.qiyukf.unicorn.api.customization.input.InputPanelOptions;
import com.qiyukf.unicorn.api.event.EventCallback;
import com.qiyukf.unicorn.api.event.EventProcessFactory;
import com.qiyukf.unicorn.api.event.SDKEvents;
import com.qiyukf.unicorn.api.event.UnicornEventBase;
import com.qiyukf.unicorn.api.event.entry.RequestPermissionEventEntry;
import com.soundcloud.android.crop.UriUtil; import com.soundcloud.android.crop.UriUtil;
import java.util.ArrayList; import java.util.ArrayList;
@@ -109,7 +114,17 @@ public class CustomerServerHelper {
options.uiCustomization.leftAvatar = uri.toString(); options.uiCustomization.leftAvatar = uri.toString();
options.uiCustomization.titleCenter = true; options.uiCustomization.titleCenter = true;
options.sdkEvents = new SDKEvents();
options.sdkEvents.eventProcessFactory = new EventProcessFactory() {
@Override
public UnicornEventBase eventOf(int i) {
if (i == 5) {
return new RequestPermissionEvent();
} else {
return null;
}
}
};
// appKey 可以在七鱼管理系统->设置->App 接入 页面找到 // appKey 可以在七鱼管理系统->设置->App 接入 页面找到
Unicorn.init(context, XChatConstants.QI_YU_KF_KEY, options, new GlideImageLoader(context)); Unicorn.init(context, XChatConstants.QI_YU_KF_KEY, options, new GlideImageLoader(context));
Unicorn.initSdk(); Unicorn.initSdk();
@@ -133,5 +148,4 @@ public class CustomerServerHelper {
Unicorn.logout(); Unicorn.logout();
isInit = false; isInit = false;
} }
} }

View File

@@ -0,0 +1,67 @@
package com.nnbc123.app.qiyukefu
import android.Manifest
import android.app.Activity
import android.content.Context
import android.content.Intent
import android.net.Uri
import android.provider.Settings
import com.nnbc123.app.ui.widget.dialog.CommonTipDialog
import com.qiyukf.unicorn.api.event.EventCallback
import com.qiyukf.unicorn.api.event.UnicornEventBase
import com.qiyukf.unicorn.api.event.entry.RequestPermissionEventEntry
/**
* Created by Max on 2024/1/4 11:10
* Desc:
**/
class RequestPermissionEvent : UnicornEventBase<RequestPermissionEventEntry> {
override fun onEvent(
p0: RequestPermissionEventEntry?,
p1: Context?,
p2: EventCallback<RequestPermissionEventEntry>?
) {
p2?.onNotPorcessEvent()
}
override fun onDenyEvent(p0: Context?, p1: RequestPermissionEventEntry?): Boolean {
if (p0 == null) {
return super.onDenyEvent(p0, p1)
}
if (p1?.permissionList?.firstOrNull {
it == Manifest.permission.RECORD_AUDIO
} != null) {
showDeniedTips(p0, "为了实现连麦及语音输入等功能,请您允许应用向您获取“麦克风”权限")
return true
} else if (p1?.permissionList?.firstOrNull {
it == "android.permission.CAMERA" || it == "android.permission.READ_MEDIA_IMAGES" || it == "android.permission.READ_MEDIA_VIDEO"
} != null) {
showDeniedTips(p0, "访问你的本地内容,以能正常使用图片上传、视频发送等应用功能")
return true
}
return super.onDenyEvent(p0, p1)
}
private fun showDeniedTips(context: Context, message: String) {
CommonTipDialog(context).apply {
setTipMsg(message)
setOkText("去设置")
setOnActionListener(
object : CommonTipDialog.OnActionListener {
override fun onOk() {
//同意跳到应用详情页面
val packageUri =
Uri.parse("package:${context.packageName}")
val intent = Intent(
Settings.ACTION_APPLICATION_DETAILS_SETTINGS,
packageUri
)
(context as? Activity)?.startActivityForResult(
intent, 0
)
}
}
)
}.show()
}
}

View File

@@ -7,6 +7,7 @@ import android.graphics.Color;
import android.media.AudioManager; import android.media.AudioManager;
import android.net.Uri; import android.net.Uri;
import android.os.Bundle; import android.os.Bundle;
import android.provider.Settings;
import android.text.SpannableString; import android.text.SpannableString;
import android.text.Spanned; import android.text.Spanned;
import android.text.TextUtils; import android.text.TextUtils;
@@ -59,6 +60,7 @@ import com.nnbc123.app.ui.im.MessageListPanelEx;
import com.nnbc123.app.ui.im.chat.MVHChatterBoxStart; 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.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;
@@ -612,11 +614,34 @@ public class MessageFragment extends TFragment implements ModuleProxy, MessageLi
if (result) { if (result) {
event.getSuccess().accept(result); event.getSuccess().accept(result);
} else { } else {
SingleToastUtil.showToast(getString(R.string.ask_again)); showPermissionDeniedTipsDialog("为了实现连麦及语音输入等功能,请您允许应用向您获取“麦克风”权限");
} }
}); });
} }
private void showPermissionDeniedTipsDialog(String message){
CommonTipDialog mPrivacyDialog = new CommonTipDialog(getContext());
mPrivacyDialog.setTipMsg(message);
mPrivacyDialog.setOkText("去设置");
mPrivacyDialog.setOnActionListener(
new CommonTipDialog.OnActionListener() {
@Override
public void onOk() {
//同意跳到应用详情页面
Uri packageUri = Uri.parse("package:" + getContext().getPackageName());
Intent intent = new Intent(
Settings.ACTION_APPLICATION_DETAILS_SETTINGS,
packageUri
);
startActivityForResult(
intent, 0
);
}
}
);
mPrivacyDialog.show();
}
@Subscribe(threadMode = ThreadMode.MAIN) @Subscribe(threadMode = ThreadMode.MAIN)
@SuppressLint("CheckResult") @SuppressLint("CheckResult")
public void onNimImageActionEvent(NimImageActionEvent event) { public void onNimImageActionEvent(NimImageActionEvent event) {

View File

@@ -3,11 +3,13 @@ package com.nnbc123.app.community.publish.view;
import android.Manifest; import android.Manifest;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.net.Uri;
import android.os.Bundle; import android.os.Bundle;
import androidx.recyclerview.widget.GridLayoutManager; import androidx.recyclerview.widget.GridLayoutManager;
import androidx.recyclerview.widget.RecyclerView; import androidx.recyclerview.widget.RecyclerView;
import android.provider.Settings;
import android.text.Editable; import android.text.Editable;
import android.text.TextUtils; import android.text.TextUtils;
import android.text.TextWatcher; import android.text.TextWatcher;
@@ -21,8 +23,10 @@ import android.widget.RelativeLayout;
import android.widget.TextView; import android.widget.TextView;
import com.google.android.flexbox.FlexboxLayout; import com.google.android.flexbox.FlexboxLayout;
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.ui.widget.dialog.CommonTipDialog;
import com.trello.rxlifecycle3.android.ActivityEvent; import com.trello.rxlifecycle3.android.ActivityEvent;
import com.nnbc123.app.R; import com.nnbc123.app.R;
import com.nnbc123.app.base.BaseMvpActivity; import com.nnbc123.app.base.BaseMvpActivity;
@@ -191,7 +195,8 @@ 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()) {
checkPermission(() -> { checkPermission((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());
int maxCanSelect = 9 - uploadList.size(); int maxCanSelect = 9 - uploadList.size();
@@ -209,8 +214,10 @@ public class PublishActivity extends BaseMvpActivity<IPublishView, PublishPresen
.setType(2) .setType(2)
.setOriginalImagee(isOriginalImage) .setOriginalImagee(isOriginalImage)
.forResult(ConstantValue.CODE_CHOOSE_PHOTO); .forResult(ConstantValue.CODE_CHOOSE_PHOTO);
}, R.string.ask_storage, Manifest.permission.READ_EXTERNAL_STORAGE); } else {
showPermissionDeniedDialog();
}
}, Manifest.permission.READ_EXTERNAL_STORAGE);
} 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));
@@ -230,6 +237,29 @@ public class PublishActivity extends BaseMvpActivity<IPublishView, PublishPresen
updateImagesData(); updateImagesData();
} }
private void showPermissionDeniedDialog(){
CommonTipDialog mPrivacyDialog = new CommonTipDialog(context);
mPrivacyDialog.setTipMsg("访问你的本地内容,以能正常使用图片上传、视频发送等应用功能");
mPrivacyDialog.setOkText("去设置");
mPrivacyDialog.setOnActionListener(
new CommonTipDialog.OnActionListener() {
@Override
public void onOk() {
//同意跳到应用详情页面
Uri packageUri = Uri.parse("package:" + getPackageName());
Intent intent = new Intent(
Settings.ACTION_APPLICATION_DETAILS_SETTINGS,
packageUri
);
startActivityForResult(
intent, 0
);
}
}
);
mPrivacyDialog.show();
}
private void updateImagesData() { private void updateImagesData() {
List<PublishItem> tmp = new ArrayList<>(); List<PublishItem> tmp = new ArrayList<>();
for (int i = 0; i < uploadList.size(); i++) { for (int i = 0; i < uploadList.size(); i++) {