部分机型进行运行时权限申请时不弹出授权弹框是什么情况?百分百弹出授权弹框,要不?

先看效果:


最近上架包到Googleplay的时候,由于targetSdkVersion低于26,被要求调整到26,那就调整呗。一调整,各种坑就来了。其他都是小坑。不讲。主要还是平时没当回事的运行时权限申请这块出问题了。在部分手机上checkSelfPermission完成后,如果没有权限,就会调用

requestPermissions(@NonNull final Activity activity, @NonNull final String[] permissions, final int requestCode)

来申请权限。正常情况下,这个方法一旦调用,就会弹出授权弹框。但是部分机型,却不会弹出。比如vivo,oppo,小米的部分机型。就不会,尤其是小米。即便知道没有权限,他能无限循环的申请都不弹出来。这是什么情况呢?

在做了一堆实验后如下规律(位置权限为例)。部分小米手机,首次安装app,权限都是询问状态。有些直接是允许。都不会弹出授权弹框。即便一直申请也不会弹出。网上有说要针对miui加入安装中心授权的判断。我加过了,没有用。最后看到别的app,进入可以直接弹出。这就有点好奇了。我自己的app经过大量测试,发现,要么是在五分钟后才弹出,要么就是在第二次打开app弹出。考虑了下位置权限的调用逻辑后发现:

    这部分机型,真的是只有在你调用了该部分方法的时候才会申请授权。即便你没有调用    requestPermissions()方法,也会自动弹出授权弹框。 再试了下READ_PHONE_STATE权限,也是这样。真是无语了。被这个问题困扰了一天。再次记录下。方便其他人,莫入坑。

看到没,我就是在调用申请授权之前,先去调用相应的方法。我只需要位置权限,所以只调用了这个方法。如果想用READ_PHONE_STATE权限,也需要在申请授权之前调用。如下

TelephonyManager TelephonyMgr = (TelephonyManager) context.getSystemService(context.TELEPHONY_SERVICE);
ime = TelephonyMgr.getDeviceId();
demo下载地址: https://download.csdn.net/download/shoneworn/10508629
  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
Android中使用setTargetRotation方法设置预览图像的旋转角度时,可能会现预览图像放大的问题,这通常是由于摄像头驱动程序的实现不够完善所引起的。原因是在部分机型上,摄像头的预览图像并不是直接输的,而是经过了一个缓冲区的处理,当使用setTargetRotation方法设置旋转角度时,缓冲区中的图像会被拉伸或压缩,导致现预览图像放大的问题。 为了解决这个问题,我们可以使用Matrix类对预览图像进行旋转和缩放操作,而不是使用setTargetRotation方法。具体来说,我们可以在SurfaceTextureListener的onSurfaceTextureAvailable()方法中获取到SurfaceTexture对象,并使用这个对象创建一个Surface对象,然后在Camera的setPreviewTexture()方法中设置这个Surface对象,这样就可以使用SurfaceTexture和Camera之间的缓冲区直接显示预览图像,而不会现放大的问题。 以下是一个简单的代码示例,演示了如何使用Matrix类进行旋转和缩放操作: ```java Matrix matrix = new Matrix(); // 旋转90度 matrix.setRotate(90); // 缩放2倍 matrix.setScale(2, 2); Camera camera = Camera.open(); Camera.Parameters parameters = camera.getParameters(); parameters.setRotation(90); camera.setParameters(parameters); camera.setDisplayOrientation(90); try { camera.setPreviewTexture(surfaceTexture); } catch (IOException e) { e.printStackTrace(); } camera.startPreview(); // 获取预览图像 byte[] buffer = new byte[previewSize.width * previewSize.height * 3 / 2]; camera.addCallbackBuffer(buffer); camera.setPreviewCallbackWithBuffer(new Camera.PreviewCallback() { @Override public void onPreviewFrame(byte[] data, Camera camera) { // 将预览图像旋转和缩放后显示在SurfaceTexture上 YuvImage yuvImage = new YuvImage(data, ImageFormat.NV21, previewSize.width, previewSize.height, null); ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); yuvImage.compressToJpeg(new Rect(0, 0, previewSize.width, previewSize.height), 100, outputStream); Bitmap bitmap = BitmapFactory.decodeByteArray(outputStream.toByteArray(), 0, outputStream.size()); Bitmap rotatedBitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true); Surface surface = new Surface(surfaceTexture); Canvas canvas = surface.lockCanvas(null); canvas.drawBitmap(rotatedBitmap, 0, 0, null); surface.unlockCanvasAndPost(canvas); surface.release(); camera.addCallbackBuffer(data); } }); ``` 在这个示例中,我们首先创建了一个Matrix对象,并使用setRotate()和setScale()方法对其进行了旋转和缩放操作,然后使用Camera对象获取了摄像头的参数,并使用setParameters()方法设置了摄像头的旋转角度和显示方向。接着,我们使用Camera的setPreviewTexture()方法将SurfaceTexture对象设置为预览图像的目标,然后使用Camera的startPreview()方法开始预览。 在获取预览图像时,我们使用Camera的addCallbackBuffer()方法设置了一个预览图像的缓冲区,并使用setPreviewCallbackWithBuffer()方法设置了一个回调函数,当有新的预览图像时,就会调用这个回调函数。在回调函数中,我们将预览图像转换为Bitmap对象,并使用createBitmap()方法对其进行旋转和缩放操作,最后将旋转和缩放后的Bitmap对象通过Canvas对象显示在SurfaceTexture上。 需要注意的是,在每次回调函数中需要使用Camera的addCallbackBuffer()方法重新设置预览图像的缓冲区,否则会导致现预览图像异常的问题。此外,在使用Surface对象时,需要在显示完毕后调用unlockCanvasAndPost()方法释放Surface对象。
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值