feat:完善部分场景的权限拒绝提示
This commit is contained in:
@@ -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()
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 是否有麦克风权限
|
* 是否有麦克风权限
|
||||||
*
|
*
|
||||||
|
@@ -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);
|
||||||
|
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@@ -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()
|
||||||
|
}
|
||||||
|
}
|
@@ -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) {
|
||||||
|
@@ -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++) {
|
||||||
|
Reference in New Issue
Block a user