当前位置: 代码迷 >> Android >> Android captureScreen 截屏有关问题,
  详细解决方案

Android captureScreen 截屏有关问题,

热度:84   发布时间:2016-05-01 12:33:27.0
Android captureScreen 截屏问题,求助!!!
大家好,我看了这篇 http://blog.csdn.net/zmyde2010/article/details/6925498 博文之后,想要在android4.0.3系统也实现用android源码截屏。我下载android源码,编译,并单独编译jni模块。编译成功了,但是运行时出错,Fatal signal 11 (SIGSEGV) at 0x00000000 (code=1)。通过无穷无尽的查资料,发现此问题有可能是想库文件的函数中传递空指针造成的。顺着这个思路研究,看log发现是在cpp文件中调用完composer->captureScreen函数后发现其返回值为NO_ERROR,但是heap却是null,w和h都是0,所以到后面调用heap->getBase()时出错,想请教下是什么原因导致调用有问题?我该如何解决。谢谢!!~~~~~~
------最佳解决方案--------------------
4.03接口已经不是原来的接口了
const char *file_path = env->GetStringUTFChars(file, NULL);

    const String16 name("SurfaceFlinger");
    sp<ISurfaceComposer> composer;
    getService(name, &composer);

    sp<IMemoryHeap> heap;
    uint32_t w, h;
    PixelFormat f;
   status_t err = composer->captureScreen(0, &heap, &w, &h, &f, 0, 0,0,INT_MAX);
    if (err != NO_ERROR) {
        LOGE("screen capture failed: %s\n", strerror(-err));
        exit(0);
   }

    LOGD("screen capture success: w=%u, h=%u, pixels=%p\n",
            w, h, heap->getBase());

    LOGD("saving file as PNG in %s ...\n", file_path);

    SkBitmap b;
    b.setConfig(SkBitmap::kARGB_8888_Config, w, h);
    b.setPixels(heap->getBase());
    SkImageEncoder::EncodeFile(file_path, b,
            SkImageEncoder::kPNG_Type, SkImageEncoder::kDefaultQuality);  
------其他解决方案--------------------
呵呵,谢谢,这个问题我之前知道了,不是由于这个原因引起的。最后我发现还是权限的问题。并无提示权限不足,但是执行函数时返回null。。。
------其他解决方案--------------------
引用:
呵呵,谢谢,这个问题我之前知道了,不是由于这个原因引起的。最后我发现还是权限的问题。并无提示权限不足,但是执行函数时返回null。。。



楼主好,我编译能通过,但是加载.so的时候发生了Ljava/lang/UnsatisfiedLinkError,
但是我把截屏函数中的代码换成别的就能正常加载.SO并正确执行。不知道楼主碰没碰到过此问题?
------其他解决方案--------------------
引用:
呵呵,谢谢,这个问题我之前知道了,不是由于这个原因引起的。最后我发现还是权限的问题。并无提示权限不足,但是执行函数时返回null。。。


楼主你好,经过一通弄后,我跟你碰到一模一样的问题,“并无提示权限不足,但是执行函数时返回null。。。”。这个你是怎么解决的啊,请问
------其他解决方案--------------------
你先别把它写成so文件 ,先写成可执行文件,手机root后 在java代码中用Runtime.getRuntime.exec("su")
获取输出流 执行程序文件,看看能否成功运行captureScreen()函数 。
目前,通过lib方式调用captureScreen函数 都是 用平台签名来解决的 使apk有了读取framebuffer权限,但是这方法没有可移植性,只能在自己的手机上用。
具体方法我也正在研究中,可以慢慢交流
------其他解决方案--------------------
那个so文件问题,有可能是函数名或是参数有些问题,不过你已经解决了哈哈 恭喜呀
  相关解决方案