Androidの最近のブログ記事

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

の続き。

androidzaurus先生のはてぶの指摘にしたがい、Androidアプリ内からNDKでadbdに接続してみました。

 

ループバックアドレスの5037ポートに接続してみると。

 

「せっ、せっ、接続できてた・・・」

 

何かの間違いかと思って、続けて write() してみても、エラーにならない。。。(((;゜Д゜))

 

おそるおそる read() してみても、エラーにならない。。。((((;゜Д゜)))

 

で、肝心のadbdから読む込んだバッファをみてみると、

adbd_responce.png

おおおっー。"FAIL"の文字が!!!

 

なんで"FAIL"で喜んでいるかというと、この文字列は、adbdが作っているからなんです。

期待値は、"OKAY"なんですが、それはさておき、ハンドシェイクは成功ということになります。

 

残念ながら時間切れなので、ここまでです。

 

誰か、後は頼んだよ!(これ以上無理かもしんないですが・・・)


※追記:エミュレータだと接続できましたが、HT-03Aだと接続できませんでした・・・orz...

Android 周辺の人のが結構 Twitter 使っているみたいだったので、
自分も、ずいぶん昔に取得して、放置していたアカウントを再開してみることにしました。

が、

早速、HT-03A に Twidroid をインストールするも繋がらず。。。

よくわからずググってたら、こんな画面が・・・。

twitter_down.png

運が悪いとしか思えない。

結論から言えば、/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);
    ...
}

無料アプリカタログ。。。

HT-03A付属の標準バッテリー1,340mAより、210mA多い、1,550mA。。。

たしかに便利そう。私は、2個目のバッテリーを未開封ですが。。。

コンセントありのマック/マクドでコーヒー飲みながら充電が至福の時。。。

私はADP1に貼られたものを無理やり剥がして使っています。。。

たしかに、真剣な顔でRobo Defenseしているのを見られたくないかも。。。

Donut の手書きジェスチャーの話の続編。

前回、手書きジェスチャーを追加できることがわかったのですが、
削除方法がわからず困っておりました。

 

結局のところ、ソースコードから追って、解決しました。。。

 

手書きジェスチャーの一覧を表示するには

ホームスクリーンでメニューキーを押下後、Gestures(ジェスチャー)を選択すると、
登録済のジェスチャーを一覧表示することができます。

menu_gestures.png gestures.png

 

手書きジェスチャーの一覧をリネーム/削除するには

ジェスチャーの一覧表示後、リストの行(アイテム)を長押しすると、リネーム、または、削除を実行できます。

※リストの行(アイテム)をタップしても・・・、メニューを押しても・・・、何も起こりません。。。。

gestures_long_press.png

 

困ったら長押しが基本。。。

Donutでは、ホームスクリーンでホームキーを押すと、アプリ起動用?の手書きジェスチャーが起動するようです。

 

手書きジェスチャーを登録するには

手書きジェスチャーを起動後、画面を一筆書きした後、右下の+ボタンをクリックします。

※ここでは、数字の8を書きました

draw_a_gesture.png add_gesture.png 

 

次に、ショートカット選択画面が表示されるので、関連づけさせたい任意のショートカットを選択します。

※ここでは、Settingsアプリケーションを選択しました

select_shortcut.png added_gesture.png 

すると、次回以降、手書きジェスチャー画面で、8を手書きすると、Settingsアプリケーションが起動するようになります。

 

他にも、縦線、横線、円、四角、星(左から一筆書き)、星(右から一筆書き)を登録してみました。

vertical_line.png horizontal_line.png  

square.png

star.pngstar2.png

 

ちなみに、Androidのソースコードでは、Launcherのコードは、

packages\apps\Launcher\src\com\android\launcher

下にあります。

 

また、android.gestureパッケージのソースコードは、

frameworks\base\core\java\android\gesture

下にあります。

 

最後になって申し訳ないのですが、

ADP1 に Donut をインストールする手順を書いてくださったブリリアントサービス先生、sola先生に感謝です!

[Android] Donut Power Control Widget

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

Donutでは、標準の設定(Settings)アプリに、
トグル(toggle)系の電源管理ウィジェット(Power Control Widget)が含まれていました。

 

このウィジェットでは、以下のとおり、5種類の設定を簡単に変更することができます。

  1. Wifi の On/Off 切り替え
  2. Bluetooth の On/Off 切り替え
  3. GPS の On/Off 切り替え
  4. バックグランドデータの同期(Sync)の On/Off 切り替え
  5. 画面の明るさ(Brightness)の 3段階切り替え

 

ごにょごにょっと入れてみると、以下のような感じでした。

donut_power_control.png

[Android] simple で BASIC

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

simple - Project Hosting on Google Code
http://code.google.com/p/simple/

 

ネタ元は、こちら。

  1. [N] 「Simple」Androidアプリを開発できるBASICのようなプログラミング言語
  2. akaiho St. » Androidアプリケーション用開発&実行環境 simpleを使ってみる・・・安生先生
  3. Flex、AIR、Java、Androidなど » Android用のアプリをBASICで書けるようになったようです

 

安生先生のブログを読むこと、5分後、BASICで書かれたテトリスが動作!

昨日も感じたのですが、Android ブロガーって素晴らしい。。。

tetris.png

※上記ブログでは、Mac 環境をベースに解説されていましたが、Win 環境でも適宜読み替えることで同じ手順でできます。

 

上手くいかなかった場合

  • 「JAVA_HOME」「ANDROID_HOME」「SIMPLE_HOME」の環境設定変数が正しいことを確認すること
    ※Win 環境の場合、コマンドラインから「set」コマンドを実行して確認できます
  • Java の bin フォルダ、Android SDK の tools フォルダ、simple フォルダにパスが通っていることを確認すること
    ※コマンドラインから「keytool」「adb」「simplec」コマンドを実行できるかどうかで確認できます

 

最後に、落としてきたソースコードをみて気づいたのですが、simple の BASIC は、VB/VBA ライクですね。

simple のプロジェクトホームでも下記のように書かれていました。

In the 90s, a big company from up north was extremely successful with a dialect of the programming language BASIC (acronym for Beginner's All-purpose Symbolic Instruction Code). 

・・・。

90年代ですか・・・。

てっきり、80年代の MSX の BASIC とか、PC98 の N88BASIC を期待したのですが。。。

行番号書いていた時代が懐かしい。

AppWidgets と省電力化について、下記リンク先に興味深いトライアル記事がありました。

「思ったより、省電力対応の作りにするのに時間かかっている件 - 闘争より逃走したい日記」
http://d.hatena.ne.jp/TAKAOMAYA/20090728/1248751971

※この記事は、複数のエントリに分割されているので、いったん RSS でフィードした方が読みやすいです
 ブラウザから読むには、リンク先内の左方向へのリンクの順に読むのが正解

 

本題に戻ると、同関連エントリの最後で、onReceive() から AppWidgetManger の取得方法が・・・という書き込みで終了していました。。。

関係ないかもしれないですが、Context から AppWidgetManager のインスタンスを取得する方法を以下に書いておきます。。。

public void onReceive(Context context, Intent intent) {
    ・・・省略・・・
    AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
    ・・・省略・・・
}

 

ところで、その後のエントリで、Widget はリリースされていましたで、さっそくインストールしてみました。

Minutes Widget for Android (初音ミクVer) 、1.0.2 リリースしました。 - 闘争より逃走したい日記
http://d.hatena.ne.jp/TAKAOMAYA/20090728/1248785866

 

ダウンロードは、Android Market から、「Minutes」で検索して辿り着きました。

MinutesWidgetForAndroid.png

 

省電力化の際、「Spare Parts」や「Battery Graph」(どちらも Android Market からDL化)で得られる情報も役に立つので、
今後に期待したいですね。

省電力化については、いづれまとめる予定(のつもり)。

android.graphics パッケージ Bitmap クラスの static メソッドである createBitmap() を使用すると、動的に Bitmap を作成することができます。

Bitmap を編集する場合、getPixels() / setPixels() を呼び出すことで、ピクセル操作することができるのですが、この方法だと、直線や円など、複雑な描画をするのは、少々面倒です。

そういった場合、BItmap と Canvas クラスをあわせて使用すると、Canvas クラスの高度な描画メソッドが利用できるため、複雑な描画を簡単にすることができます。

具体的には、描画したい Bitmap を Canvas クラスのコンストラクタに渡し、Canvas クラスの描画メソッドを呼び出すだけです。

サンプルソースコードは、以下のとおりです。

 

サンプルソースコード

Bitmap bitmap = Bitmap.createBitmap(72, 72, Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(bitmap);
// ここから、Canvas に対して、直線、円、矩形、塗りつぶし、回転・・・などの呼び出しをすると、
// 描画結果は、Bitmap に反映される
// 以下は、パスを描画する例
Paint paint = new Paint();
paint.setAntiAlias(true);
paint.setColor(Color.BLACK);
paint.setStyle(Paint.Style.FILL);
Path path = new Path();
path.moveTo();
path.lineTo();
// ...
path.close();
canvas.drawPath(path, paint);

 

あわせて読みたい

<<前のページへ 1617181920212223242526

Android 楽しいよ!

2010年12月

      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  

自作フリーソフトウェア