画面イメージ /dev/graphics/fb0

 Android  画面イメージ /dev/graphics/fb0 はコメントを受け付けていません。
10月 312010
 

画面イメージの取得についてメモ。
ちゃんとフォーマット解析したかったけど時間が無いので。。。

adb shellから

$ cat /dev/graphics/fb0 > /sdcard/fb0

としてみると、

$ ls -l
—-rwxr-x system   sdcard_rw   307200 2010-10-29 23:12 fb0

というファイルが出来ました。

adb shellは権限が多いらしく、connectbotでlocalログインしてもpermission deniedになります。(当然root取れば可能です)

このファイルサイズですが、

240×320(miniproの画面サイズ)=76,800
76,800*4=307,200

という事で、1ピクセル4バイトの画面イメージという事でしょう。

内部のフォーマットが分からないけど、生データであればBMPヘッダを付けてみれば見れるかも?という事で、BMPヘッダ(4バイト=32bitカラー)をごりごりバイナリエディタで手打ちしてみた。

結果がコレだ。

見えた!けど・・・

4画面繰り返してる、上下逆、色が変。

フォーマットはBMP(32bit)と違かったけど、画面イメージがここから取れるって事は間違いないみたい。

rootさえ取れてれば、普通にキャプチャできますね。
画像フォーマットさえわかれば。
調べればすぐに分かるらしいですので、時間が有れば続く、かも。

音声等通信中に切断する方法メモ

 Android  音声等通信中に切断する方法メモ はコメントを受け付けていません。
10月 312010
 

なんとか切断までこぎつけたのでメモ。

もっと無駄を省ける気はしている。
あとエラー処理もかいてません。

実機(SO-01B:1.6)で確認済み
別途ITelephony.aidlを追加する事

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.os.IBinder;
import android.os.RemoteException;

import com.android.internal.telephony.ITelephony;
import android.telephony.*;

public class MainActivity extends Activity {
 private TelephonyManager m_telephonyManager;
 private ITelephony m_telephonyService;
 private PhoneStateListener m_phoneStateListener;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

       
        m_telephonyManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
        Class<?> serviceManagerClass = maybeForName(“android.os.ServiceManager”);
        if (serviceManagerClass == null) {
         System.out.println(“serviceManagerClass==null;”);
        } 
        Method getServiceMethod = maybeGetMethod(serviceManagerClass, “getService”, String.class);
        if (getServiceMethod == null) {
         System.out.println(“getServiceMethod==null;”);
        } 
        Object telephonyService=invoke(getServiceMethod, null, Context.TELEPHONY_SERVICE);
        if (telephonyService == null) {
         System.out.println(“telephonyService==null;”);
        } 
        m_telephonyService = ITelephony.Stub.asInterface((IBinder)telephonyService);

        try {
   m_telephonyService.endCall();
  } catch (RemoteException e) {
   // TODO 自動生成された catch ブロック
   e.printStackTrace();
  }       

    }
 
 
      private static Class<?> maybeForName(String name) {
        try {
          return Class.forName(name);
        } catch (ClassNotFoundException cnfe) {
          // OK
          return null;
        } catch (RuntimeException re) { 
          return null;
        }
      }
    
      private static Method maybeGetMethod(Class<?> clazz, String name, Class<?>… argClasses) {
        try {
          return clazz.getMethod(name, argClasses);
        } catch (NoSuchMethodException nsme) {
          // OK
          return null;
        } catch (RuntimeException re) { 
          return null;
        }
      }
    
      private static Object invoke(Method method, Object instance, Object… args) {
        try {
          return method.invoke(instance, args);
        } catch (IllegalAccessException e) { 
          return null;
        } catch (InvocationTargetException e) { 
          return null;
        } catch (RuntimeException re) { 
          return null;
        }
      }

}