[Android] NDK でスクリーンショット(キャプチャ)アプリを作るも root 権限が

| トラックバック(0) |

結論から言えば、/dev/graphics/fb0 へのアクセス権限があれば
NDK を使ってスクリーンショット(キャプチャ)Androidアプリを作れます。

 

検証用に、エミュレーター/ADP1で、同ディレクトリのアクセス権を変更し、
NDK を使ってフレームバッファをコピーするソースコードを書いて、Androidアプリに組み込んで実行してみたところ、
スクリーンショット(キャプチャ)をとることができました。

 

ですが、 

肝心の HT-03A では、そもそも root 権限を取得できないので、結局のところ、この方法は使えません。。。

 

参考までに試してみたソースコードの断片を貼っておきます。。。

 

C言語側のサンプルソースコード 

// 説明を簡略化するために、エラー処理など諸々省略・・・
struct fb_fix_screeninfo fi;
struct fb_var_screeninfo vi;
int fd = open("/dev/graphics/fb0", O_RDONLY);
ioctl(fd, FBIOGET_FSCREENINFO, &fi);
ioctl(fd, FBIOGET_VSCREENINFO, &vi);
// 例えば、
// vi.xres には 320 [pixel]
// vi.yres には 480 [pixel]
// vi.bits_per_pixel には 16 [bpp]
// などの値を取得できます
void *bits = mmap(0, fi.smem_len, PROT_READ, MAP_SHARED, fd, 0);
// ここでC言語側でメモリを確保して返すか、
// 呼び出し側(Java)で確保したメモリ(※1)にコピーする(※2)
munmap(bits, fi.smem_len);
close(fd);

 

※1: Java 側のサンプルコード

ByteBuffer buffer = ByteBuffer.allocate(必要なメモリサイズ);
hoge(buffer.array()); // ここで C言語側に渡す
Bitmap bitmap = Bitmap.createBitmap(幅(320とか), 高さ(480), Bitmap.Config.RGB_565(16bppの場合));
bitmap.copyPixelsFromBuffer(buffer); // 16BPP のBMP 完成!

※2:C言語側のサンプルソースコード

hoge
(
    JNIEnv* env,
    jobject thiz,
    jbyteArray buffer
)
{
    ...
    jbyte* jbyteBuffer = (*env)->GetByteArrayElements(env, buffer, &b);
    memcpy(jbyteBuffer, bits, fi.smem_len);
    (*env)->ReleaseByteArrayElements(env, buffer, jbyteBuffer, 0);
    ...
}

トラックバック(0)

トラックバックURL: http://mt.adakoda.com/mt-tb.cgi/262

2010年3月

  1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31      

自作フリーソフトウェア