实现apk截屏时,通常我们会使用权限:android.permission.READ_FRAME_BUFFER,在添加截屏权限后,发现还是报错:E SurfaceFlinger: Permission Denial: can’t read framebuffer pid=10983, uid=10049。很多博客说啥root怎么滴,其实还是没有用。这时我们要看报错的log在哪里打印出来的:framworks/native/services/SurfaceFlinger.cpp
if ((uid != AID_GRAPHICS) && !PermissionCache::checkPermission(sReadFramebuffer, pid, uid)) { ALOGE("Permission Denial: can't read framebuffer pid=%d, uid=%d", pid, uid); return PERMISSION_DENIED; }
从上面的源码能看出,使用系统截屏不仅需要权限,还要判断apk 的uid是否是系统进程。所以只要我们解决apk以系统进程运行,这个问题就可以解决了。
如何使apk成为系统进程呢?成为系统进程即成为系统的app,如下两点:
1. 在应用程序AndroidManifest.xml中的manifest节点中加android:sharedUserId="android.uid.system"这个属性。
2. 拥有系统签名。
完成上面两点后,使用adb命令查看运行的apk是否是系统进程:
adb shell ps | grep screenshot
system 5227 537 4655828 265612 0 0 S com.jsnh.screenshot
此时apk可以正常截屏了。
u0_a100 8397 539 4484920 183248 0 0 S com.jsnh.screenshot
如果是user进程运行就无法截屏了。

有关签名的问题可以参考如下博客:
https://blog.csdn.net/u012398902/article/details/52735980
https://blog.csdn.net/m0_38094058/article/details/82628731

更多相关文章

  1. 如何修改android工程的包名
  2. Android(安卓)AssetManager
  3. [2] Android进程孵化图
  4. java ios Android鸿鹄社交娱乐直播平台源码
  5. Android(安卓)4.0系统触摸设备概述
  6. MediaRouter的使用
  7. Android(安卓)targetSdkVersion 从22提到25 你需要知道的一切
  8. Android(安卓)开发中uboot传给Kernel 的androidboot.xxx命令行参
  9. Android获取手机和系统版本等信息的代码

随机推荐

  1. 背光之关闭(turnOff)
  2. android 字体大小像素的设置
  3. Android(安卓)简单录音程序
  4. android中的贪吃蛇源码
  5. Android(安卓)Factory Reset flow
  6. Android(安卓)内核源代码交叉编译纺
  7. 学习进度2020.02.03
  8. 获取Android(安卓)Device的信息
  9. android:numeric="integer"属性
  10. Android(安卓)实时动态刷新更改菜单