当前位置:编程学习 > wap >>

android 利用framebuffer截图问题

向各位大虾求教,最近在做android的系统截图,参考了大家提供的利用framebuffer方式读取屏幕数据,然后保存到文件的思路。但没想到第一步就败在打开framebuffer问题上了。网上有提供如下的方法:
	
        try {
Runtime.getRuntime().exec("su chmod 777 /dev/graphics/fb0");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}


使用的时候还是打开文件失败,而且我也检查了,我的应用配置里面已经添加了
<uses-permission android:name="android.permission.READ_FRAME_BUFFER" /> 

权限。

另外,说明一下,我的设备也是已经root的设备。

下面是我改写的代码(由于是第一次接触NDK编译,所以是仿照NDK的sample里面写的代码部分),麻烦大虾解惑一下:

Java部分:

package com.example.hellojni;

public class HelloJni {

static {
        System.loadLibrary("hello-jni");
    }
    public static native String  stringFromJNI();
    
    public static native int screenCapture(String fileName);
}



C部分:

#include <jni.h>
#include <string.h>
#include <fcntl.h>
#include <stdio.h>


/* This is a trivial JNI example where we use a native method
 * to return a new VM String. See the corresponding Java source
 * file located at:
 *
 *   apps/samples/hello-jni/project/src/com/example/hellojni/HelloJni.java
 */
jstring Java_com_example_hellojni_HelloJni_stringFromJNI( JNIEnv* env,
                                                  jobject thiz )
{

int fd = -1;//默认文件打开失败

///dev/graphics/fb0
fd = open("dev/graphics/fb0", O_RDWR);
if (fd < 0) {
return (*env)->NewStringUTF(env, "open(\"/dev/graphics/fb0\") failed!\n");
}else{
return (*env)->NewStringUTF(env, "open(\"/dev/graphics/fb0\") success!\n");
}

}


jint JNICALL Java_com_example_hellojni_HelloJni_screenCapture
  (JNIEnv *env, jclass thiz, jstring fileName)
{

return 0;
}


Android framebuffer 截屏 失败 --------------------编程问答-------------------- 应该是没有读取 系统文件的权限,还有就是楼主这种frameBuffer 截图的方法,必须需要有root才行,否则是不行了,建议采取应用内系统屏幕截图的方式! --------------------编程问答-------------------- 因为产品需求,所以必须采取系统截图。您刚才所提到的,我都注意到了,不过还是依旧没有起效。继续求解惑中。。。 --------------------编程问答-------------------- 虽然不能帮助到楼主但是学到了些  顶楼主 --------------------编程问答-------------------- 自己给自己结贴吧,好可怜,都没人回应。我的解决方式和大家分享一下。将原来修改文件权限的代码换成下面这个就好了。代码如下:

try {
    Runtime.getRuntime().exec(new String[]{"/system/bin/su","-c", "chmod 777 /dev/graphics/fb0"});
} catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}


以前修改文件权限的方式不对。
--------------------编程问答-------------------- 楼主其实部分机型无需root的,当然原理并不是读取framebuffer,同时你上面的方法,那个su系统默认是没有的,越狱后自己考进去的吧 --------------------编程问答-------------------- 的确上述方法一开始出现的问题就是su默认的路径问题,导致无法使用root权限来修改文件属性。这个是我目前能了解到的比较通用性的方法。还有一种是针对2.3系统的方式,不过那个不具有通用性,所以我就没有考虑那种方式的实现,除此之外,目前我还不知道有其他好的方式,希望DrSmart你能分享一下你不是通过读取framebuffer进行截图的方式。
补充:移动开发 ,  Android
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,