From d300ef179da1edfcf236c2047ba7c0a9ffffa566 Mon Sep 17 00:00:00 2001 From: Max Date: Thu, 4 Jan 2024 12:14:34 +0800 Subject: [PATCH] =?UTF-8?q?feat:=E5=AE=8C=E5=96=84=E9=83=A8=E5=88=86?= =?UTF-8?q?=E5=9C=BA=E6=99=AF=E7=9A=84=E6=9D=83=E9=99=90=E6=8B=92=E7=BB=9D?= =?UTF-8?q?=E6=8F=90=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/avroom/fragment/BaseRoomFragment.kt | 32 ++++++++- .../com/nnbc123/app/base/BaseActivity.java | 12 ++++ .../app/qiyukefu/CustomerServerHelper.java | 18 ++++- .../app/qiyukefu/RequestPermissionEvent.kt | 67 ++++++++++++++++++ .../app/ui/im/fragment/MessageFragment.java | 27 ++++++- .../publish/view/PublishActivity.java | 70 +++++++++++++------ 6 files changed, 202 insertions(+), 24 deletions(-) create mode 100644 app/src/main/java/com/nnbc123/app/qiyukefu/RequestPermissionEvent.kt diff --git a/app/src/main/java/com/nnbc123/app/avroom/fragment/BaseRoomFragment.kt b/app/src/main/java/com/nnbc123/app/avroom/fragment/BaseRoomFragment.kt index 91f94b19a..d94b610c7 100644 --- a/app/src/main/java/com/nnbc123/app/avroom/fragment/BaseRoomFragment.kt +++ b/app/src/main/java/com/nnbc123/app/avroom/fragment/BaseRoomFragment.kt @@ -3,13 +3,16 @@ package com.nnbc123.app.avroom.fragment import android.Manifest import android.annotation.SuppressLint import android.app.Activity +import android.content.Context import android.content.DialogInterface import android.content.Intent import android.content.pm.PackageManager import android.graphics.Color import android.graphics.drawable.Drawable import android.graphics.drawable.GradientDrawable +import android.net.Uri import android.os.Bundle +import android.provider.Settings import android.text.TextUtils import android.text.style.ForegroundColorSpan 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.ChatRoomMessage import com.nnbc123.app.avroom.hour_rank.RoomHourRankWidget +import com.nnbc123.app.ui.widget.dialog.CommonTipDialog import com.orhanobut.logger.Logger import com.tbruyelle.rxpermissions2.RxPermissions import com.trello.rxlifecycle3.android.FragmentEvent @@ -1146,11 +1150,37 @@ open class BaseRoomFragment?> : if (result) { mvpPresenter?.upMicroPhone(micPosition, currentUid, b) } else { - toast("请给予麦克风权限后再试!") + showDeniedTips( + requireContext(), + "为了实现连麦及语音输入等功能,请您允许应用向您获取“麦克风”权限" + ) } }, { 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() + } + /** * 是否有麦克风权限 * diff --git a/app/src/main/java/com/nnbc123/app/base/BaseActivity.java b/app/src/main/java/com/nnbc123/app/base/BaseActivity.java index 683ffad64..748e29e98 100644 --- a/app/src/main/java/com/nnbc123/app/base/BaseActivity.java +++ b/app/src/main/java/com/nnbc123/app/base/BaseActivity.java @@ -114,6 +114,7 @@ import java.lang.reflect.Field; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.List; +import java.util.function.Consumer; import io.reactivex.Observable; import io.reactivex.android.schedulers.AndroidSchedulers; @@ -821,6 +822,17 @@ public abstract class BaseActivity extends RxAppCompatActivity }, Throwable::printStackTrace); } + + @SuppressLint("CheckResult") + public void checkPermission(Consumer consumer, String... mPerms) { + rxPermissions.request(mPerms) + .subscribe(aBoolean -> { + if (consumer != null) { + consumer.accept(aBoolean); + } + }, Throwable::printStackTrace); + } + @SuppressLint("CheckResult") public Observable checkPermission(String... mPerms) { return rxPermissions.request(mPerms); diff --git a/app/src/main/java/com/nnbc123/app/qiyukefu/CustomerServerHelper.java b/app/src/main/java/com/nnbc123/app/qiyukefu/CustomerServerHelper.java index 2c17e0ab6..340a0ad9a 100644 --- a/app/src/main/java/com/nnbc123/app/qiyukefu/CustomerServerHelper.java +++ b/app/src/main/java/com/nnbc123/app/qiyukefu/CustomerServerHelper.java @@ -21,6 +21,11 @@ import com.qiyukf.unicorn.api.YSFOptions; import com.qiyukf.unicorn.api.YSFUserInfo; import com.qiyukf.unicorn.api.customization.input.ActionPanelOptions; 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 java.util.ArrayList; @@ -109,7 +114,17 @@ public class CustomerServerHelper { options.uiCustomization.leftAvatar = uri.toString(); 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 接入 页面找到 Unicorn.init(context, XChatConstants.QI_YU_KF_KEY, options, new GlideImageLoader(context)); Unicorn.initSdk(); @@ -133,5 +148,4 @@ public class CustomerServerHelper { Unicorn.logout(); isInit = false; } - } diff --git a/app/src/main/java/com/nnbc123/app/qiyukefu/RequestPermissionEvent.kt b/app/src/main/java/com/nnbc123/app/qiyukefu/RequestPermissionEvent.kt new file mode 100644 index 000000000..4c5a5d9d1 --- /dev/null +++ b/app/src/main/java/com/nnbc123/app/qiyukefu/RequestPermissionEvent.kt @@ -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 { + override fun onEvent( + p0: RequestPermissionEventEntry?, + p1: Context?, + p2: EventCallback? + ) { + 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() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/nnbc123/app/ui/im/fragment/MessageFragment.java b/app/src/main/java/com/nnbc123/app/ui/im/fragment/MessageFragment.java index a638d2b4d..36f02ac12 100644 --- a/app/src/main/java/com/nnbc123/app/ui/im/fragment/MessageFragment.java +++ b/app/src/main/java/com/nnbc123/app/ui/im/fragment/MessageFragment.java @@ -7,6 +7,7 @@ import android.graphics.Color; import android.media.AudioManager; import android.net.Uri; import android.os.Bundle; +import android.provider.Settings; import android.text.SpannableString; import android.text.Spanned; 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.model.IMCustomModel; import com.nnbc123.app.ui.webview.CommonWebViewActivity; +import com.nnbc123.app.ui.widget.dialog.CommonTipDialog; import com.nnbc123.app.utils.PushMessageHandler; import com.nnbc123.core.UriProvider; import com.nnbc123.core.auth.AuthModel; @@ -612,11 +614,34 @@ public class MessageFragment extends TFragment implements ModuleProxy, MessageLi if (result) { event.getSuccess().accept(result); } 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) @SuppressLint("CheckResult") public void onNimImageActionEvent(NimImageActionEvent event) { diff --git a/app/src/module_community/java/com/nnbc123/app/community/publish/view/PublishActivity.java b/app/src/module_community/java/com/nnbc123/app/community/publish/view/PublishActivity.java index cc3deb599..b330b0ed5 100644 --- a/app/src/module_community/java/com/nnbc123/app/community/publish/view/PublishActivity.java +++ b/app/src/module_community/java/com/nnbc123/app/community/publish/view/PublishActivity.java @@ -3,11 +3,13 @@ package com.nnbc123.app.community.publish.view; import android.Manifest; import android.content.Context; import android.content.Intent; +import android.net.Uri; import android.os.Bundle; import androidx.recyclerview.widget.GridLayoutManager; import androidx.recyclerview.widget.RecyclerView; +import android.provider.Settings; import android.text.Editable; import android.text.TextUtils; import android.text.TextWatcher; @@ -21,8 +23,10 @@ import android.widget.RelativeLayout; import android.widget.TextView; import com.google.android.flexbox.FlexboxLayout; +import com.hjq.toast.ToastUtils; import com.netease.nim.uikit.StatusBarUtil; 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.nnbc123.app.R; import com.nnbc123.app.base.BaseMvpActivity; @@ -191,26 +195,29 @@ public class PublishActivity extends BaseMvpActivity { PublishItem item = imageShowList.get(position); if (item.isAddItem()) { - checkPermission(() -> { - CaptureStrategy captureStrategy = new CaptureStrategy(true, context.getPackageName() + ".fileprovider", - BasicConfig.INSTANCE.getImageDir().getAbsolutePath()); - int maxCanSelect = 9 - uploadList.size(); - Matisse.from(PublishActivity.this) - .choose(MimeType.ofImage()) - .showSingleMediaType(true) - .capture(true) - .spanCount(4) - .captureStrategy(captureStrategy) - .countable(true) - .maxSelectable(maxCanSelect) - .originalEnable(false) - .maxOriginalSize(10) - .imageEngine(new Glide4Engine()) - .setType(2) - .setOriginalImagee(isOriginalImage) - .forResult(ConstantValue.CODE_CHOOSE_PHOTO); - }, R.string.ask_storage, Manifest.permission.READ_EXTERNAL_STORAGE); - + checkPermission((aBoolean) -> { + if (aBoolean) { + CaptureStrategy captureStrategy = new CaptureStrategy(true, context.getPackageName() + ".fileprovider", + BasicConfig.INSTANCE.getImageDir().getAbsolutePath()); + int maxCanSelect = 9 - uploadList.size(); + Matisse.from(PublishActivity.this) + .choose(MimeType.ofImage()) + .showSingleMediaType(true) + .capture(true) + .spanCount(4) + .captureStrategy(captureStrategy) + .countable(true) + .maxSelectable(maxCanSelect) + .originalEnable(false) + .maxOriginalSize(10) + .imageEngine(new Glide4Engine()) + .setType(2) + .setOriginalImagee(isOriginalImage) + .forResult(ConstantValue.CODE_CHOOSE_PHOTO); + } else { + showPermissionDeniedDialog(); + } + }, Manifest.permission.READ_EXTERNAL_STORAGE); } else { BigPhotoActivity.startCanDelete(PublishActivity.this, (ArrayList) uploadList, position, new PagerOption().setDelete(true)); @@ -230,6 +237,29 @@ public class PublishActivity extends BaseMvpActivity tmp = new ArrayList<>(); for (int i = 0; i < uploadList.size(); i++) {