注:本博客不定期更新
checkPermission
,checkSelfPermission
。而我们检查权限,通常都会通过传入的 Context 检查。这就给了我们操作的空间。BDFakeContext
,继承自 ContextWrapper
,从名称便可知,是专门用来处理百度的这个问题的。此处也建议专人专事。其他 SDK 有问题,也一样建个新类,而不是重复使用一个类。public class FakeContext extends ContextWrapper {
public FakeContext(Context base) {
super(base);
}
@Override
public Context getApplicationContext() {
return this;
}
@Override
public int checkPermission(String permission, int pid, int uid) {
// 如果是检测音频权限,则不管有没有授权,直接返回已授权
if(Manifest.permission.RECORD_AUDIO.equals(permission)) {
return PackageManager.PERMISSION_GRANTED;
}
return super.checkPermission(permission, pid, uid);
}
}
然后用上这个类:
public class BDManager {
private BDSDKManager m;
public BDManager(Context context) {
// 传入 SDK 的地方包装一次,就是这么简单
m = new BDSDKManager(new FakeContext(context));
}
}
checkPermission
方法,而是另一个 checkCallingOrSelfPermission
方法,这就好办了。依葫芦画瓢。// 省略部分代码
@Override
public int checkCallingOrSelfPermission(String permission) {
// 如果是检测音频权限,则不管有没有授权,直接返回已授权
if(Manifest.permission.RECORD_AUDIO.equals(permission)) {
return PackageManager.PERMISSION_GRANTED;
}
return super.checkCallingOrSelfPermission(permission);
}
这次的结果就很 OK 了。又学到了一招,专门对付第三方 SDK 的权限检查。
onWindowFocusChanged
方法不会调用。代码如下:getWindow().addFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL);
private void resizeImageView(ImageView imageView, String path) {
// 只解码图片大小,不解码图片数据
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeFile(path, options);
// 屏幕宽高
int screenWidth = ScreenUtil.getScreenWidth(imageView.getContext());
int screenHeight = ScreenUtil.getScreenHeight(imageView.getContext());
// 屏幕与图片的宽高比例
float widthRatio = (float)screenWidth / options.outWidth;
float heightRation = (float)screenHeight / options.outHeight;
int finalWidth = options.outWidth;
int finalHeight = options.outHeight;
// 1. 如果图片小于屏幕尺寸,则取较小值
if(widthRatio > 1 && heightRation > 1) {
float minRatio = Math.min(widthRatio, heightRation);
// 图片长宽扩大这个倍数
finalWidth = (int)(options.outWidth * minRatio);
finalHeight = (int)(options.outHeight * minRatio);
} else if (widthRatio < 1 || heightRation < 1) {
// 2. 如果图片大于屏幕尺寸,则取较大值
float maxRatio = Math.max(widthRatio, heightRation);
// 图片长宽缩小这个倍数
finalWidth = (int)(options.outWidth / maxRatio);
finalHeight = (int)(options.outHeight / maxRatio);
}
// 有相等的情况则不管,view 的尺寸,glide 的 resize,赋值finalWidth,finalHeight
ViewGroup.LayoutParams layoutParams = imageView.getLayoutParams();
layoutParams.width = finalWidth;
layoutParams.height = finalHeight;
imageView.setLayoutParams(layoutParams);
}
case MotionEvent.ACTION_POINTER_UP:
// 多指事件,只判断 rawX,rawY 不准确,判断所有手指的区域
boolean isInRecordArea = false;
for(int i = 0; i < motionEvent.getPointerCount(); i++) {
if(motionEvent.getActionIndex() == i) {
// 跳过抬起的手指的计算
continue;
}
if(isInRecordArea(recordView, motionEvent.getX(i), motionEvent.getY(i))) {
// 有手指在区域内,就够了
isInRecordArea = true;
break;
}
}
return getRecordCallback().updateRecordState(isInRecordArea, DeviceType.DEFAULT);
APP的混淆主要包括以下几个方面:
android.support.annotation.Keep
注解的内容,不能被混淆canvas 画圆时,需要注意圆的实际半径是 radius + strokeWidth,即需要额外加上画笔的宽度。画任何图形,计算尺寸时,都需要考虑 画笔的宽度 是否有影响。
Android 系统中,屏幕触摸事件和键盘按键事件是两个不同的事件流。前者是 MotionEvent,后者是 KeyEvent。如果前者的事件流还没有结束,就来了后者的事件,则中间会被插入一个 cancel 事件。即 MotionEvent ---> CancelEvent ---> KeyEvent。如果要交叉两个事件流,需要忽略掉 Cancel 事件(Cancel 事件无法判断事件源,只能忽略),这可能会导致其他很多的异常场景无法处理(比如三指按下后,系统下发了 Cancel 事件啥的,当然也与系统魔改有关)。需要注意。
Android 文件系统的目录结构大致如下:
Home 键虽然无法被onKeyDown
、onKeyUp
监听到,但是可以通过广播知道 Home 键被按下了,代码如下:
private void initHomeKeyReceiver() {
IntentFilter homeKeyFilter = new IntentFilter(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);
BroadcastReceiver homeKeyEventReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
judgeAndDealHomeKeyEvent(intent);
}
};
registerReceiver(homeKeyEventReceiver, homeKeyFilter);
}
private void judgeAndDealHomeKeyEvent(Intent intent) {
if(presenter.isCurrentConversationNull()) {
return;
}
String action = intent.getAction();
LogUtil.d(TAG, "action: " + action);
if(!Intent.ACTION_CLOSE_SYSTEM_DIALOGS.equals(action)) {
return;
}
String reason = intent.getStringExtra("reason");
if(reason == null) {
return;
}
if(reason.equals("homekey") // 点击 Home 键
|| reason.equals("recentapps") // 长按 Home 键
) {
doSomething();
}
}
原文:https://www.cnblogs.com/wellcherish/p/13502594.html