orz画像 
火曜日, 3月 1, 2011, 12:38 AM - Android
日本Androidの会 関西支部 発表部屋
スライドに使ったorz画像が好評だったので。

ライセンスはパブリックドメインにします。
  |  0 trackbacks   |  このエントリーのURL   |  related link   |   ( 3 / 756 )

開発で非root端末のDBを無理矢理に覗く方法2 
日曜日, 12月 19, 2010, 10:40 PM - Android
前の「開発で非root端末のDBを無理矢理に覗く方法」について
Android端末のIPって判らないことあるんじゃ、、、という質問があったので追記。

たしかにAndroid端末へはwifiでネットワーク接続してないと
直接接続はできないので、そのままではtelnet接続できない。
でも、USB接続の場合は以下のようにadbコマンドでローカルのポートを
Android端末のポートにフォワーディングすれば接続できる。
※:ポート番号は適当に読み替えて下さい
user@mypc:~$ ./adb -d forward tcp:8090 tcp:8090


user@mypc:~$ telnet localhost 8090
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.


要約すると接続方法は次の2つになります
◆ネットワーク経由でAndroid端末に接続する
 ・Android端末をWIFIなどでネットワークに接続する
 ・同一ネットワークのPCからAndroid端末のIPを指定して接続する
◆USB経由でAndroid端末に接続する
 ・『./adb -d forward tcp:8090 tcp:8090』コマンドでポートをフォワーディ
ングする
 ・localhostを指定して接続する


とりあえずRDBAssistantとの連携も
それなりに使えるようになったので一回きっちりまとめねば、、

  |  0 trackbacks   |  このエントリーのURL   |  related link   |   ( 3 / 951 )

開発で非root端末のDBを無理矢理に覗く方法 
日曜日, 12月 5, 2010, 09:13 PM - Android

はじめに


ここに書いている内容はCattakaが作業用に考えた
試験段階のものなので実際に使用については自己責任でお願いします。


概要


Androidアプリの開発で非root端末のSQLiteDatabaseを
覗きたかったので無理矢理に覗く方法を作ってみた。
厳密には覗けないわけではなく、該当するアプリからは
アクセスできるのだけど、これでは勝手が悪く、
できればSQLを直接叩きたかった。

今回作ったのは汎用的にコピペできるServiceのクラスファイルで、
それを対象のアプリにコピペして、Serviceを起動してあげ、
telnetでアクセスするとSQLが実行できるようになるものだ。
主なサービスの動作は以下の通り。
・サービスを起動すると指定されたポートを開く
・Telnetで接続が来たらSQLiteのDBを開く
・入力値をSQLとして入力する
・CSVとして値を返す


準備手順


TelnetSqliteService.javaをプロジェクトに追加する。
↓ダウンロードしてください。
TelnetSqliteService.java



AndroidManifest.xmlに次の2つを追加する。
・TelnetSqliteServiceを追加
・android.permission.INTERNETを追加
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="net.cattaka.telnetsqlite"
android:versionCode="1" android:versionName="1.0">
<application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name=".TelnetSqlite" android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<!-- ★:TelnetSqliteServiceを追加 -->
<service android:name=".TelnetSqliteService"></service>
</application>
<uses-sdk android:minSdkVersion="4" />
<!-- ★:android.permission.INTERNETを追加 -->
<uses-permission android:name="android.permission.INTERNET"/>
</manifest>


起動時にTelnetSqliteServiceが起動するようにする。
    public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

// TelnetSqliteサービスの起動
Intent serviceIntent = new Intent(this, TelnetSqliteService.class);
startService(serviceIntent);
}



操作方法


telnetでアクセスする。
ホスト名は端末のIPを、ポート番号はソースコードに
記載している物を指定する
user@mypc:~$ telnet 192.168.201.128 8090
Trying 192.168.201.128...
Connected to 192.168.201.128.
Escape character is '^]'.


接続したら、まず対象となるデータベースの名前を指定する。
これはSQLiteOpenHelperで指定している名前と同じにする。
この例ではwalttend.dbを指定している。
成功するとプロンプトである"$"が返される。
user@mypc:~$ telnet $ADBHOST 8090
Trying 192.168.201.128...
Connected to 192.168.201.128.
Escape character is '^]'.
walttend.db
S
$


この状態でSQLコマンドを入力すると結果が出力される。
先頭が+の行は列名称であり、-も行はデータになる。
$
SELECT NAME FROM SQLITE_MASTER;
S6
+name
-android_metadata
-sqlite_sequence
-ANIMALS
-ANIMALS_DETAIL
-ANIMALS_DETAIL2

$



テスト中:RDBAssistantと連携


このtelnetで接続できるポートに
RDBAssistantで接続出来るようにしています。
今のところ開発バージョンのみだけど、
きっちり使えるようにする予定。

RDBAssistant
開発バージョンのダウンロード





  |  0 trackbacks   |  このエントリーのURL   |  related link   |   ( 3.2 / 951 )

カスタムListViewで選択中の色が変わらないトラブル 
火曜日, 11月 23, 2010, 01:42 PM - Android
久しぶりに思いっきり嵌ったので整理してみた。

やりたいこと
行要素にカスタムViewを使ったListViewで、
チェック中の行は色を変えたい。
カスタムViewであることが味噌です。


これをクリックしてチェックすると色が変わるようにしたい。
カスタムViewだとこれが変わらずに難儀した、、。


色はselectorを使ったdrawableで指定したい。
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<!-- 押されているときの色 -->
<item android:state_pressed="true" android:drawable="@color/green" />

<!-- チェックされた時の色 -->
<item android:state_checked="true" android:drawable="@color/blue" />

<!-- トラックボールなどで動かしたときに対象になったときの色(チェックの有無ではない) -->
<item android:state_selected="true" android:drawable="@color/white" />

<!-- 何につかうんだろう? -->
<item android:state_focused="true" android:drawable="@color/red" />

<!-- それ以外 -->
<item android:drawable="@color/black" />
</selector>


トラブルの現象
通常ではListViewの行要素にselector入りのdrawableを指定した
CheckedTextViewを指定するとチェック時に色が変わる。
しかし、カスタムViewを使うとチェック時でも色が変わらない。

原因
通常では行要素にCheckedTextViewを使うが、
こいつがCheckableインターフェースを実装していて、
そのインターフェース内の処理で描画を変えていることが判明。
しかし、自分の作ったカスタムViewは
そういう作りになっていなかったため色が変わらなかった。

対処
カスタムViewにCheckableインターフェースを実装し、
setCheckedなどのメソッド内で描画を切り替える処理を入れる。
カスタムViewのクラスであるCheckableLinearLayoutを作成した。
package net.cattaka.listviewtest;

import android.content.Context;
import android.util.AttributeSet;
import android.widget.Checkable;
import android.widget.LinearLayout;

public class CheckableLinearLayout extends LinearLayout implements Checkable {
private boolean checked;
private static final int[] CHECKED_STATE_SET = { android.R.attr.state_checked };

public CheckableLinearLayout(Context context, AttributeSet attrs) {
super(context, attrs);
}

public CheckableLinearLayout(Context context) {
super(context);
}

@Override
public boolean isChecked() {
return checked;
}

@Override
public void setChecked(boolean checked) {
if (this.checked != checked) {
this.checked = checked;
refreshDrawableState();
}
}

@Override
public void toggle() {
this.checked = !this.checked;
refreshDrawableState();
}

@Override
protected int[] onCreateDrawableState(int extraSpace) {
final int[] drawableState = super.onCreateDrawableState(extraSpace + 1);
if (isChecked()) {
mergeDrawableStates(drawableState, CHECKED_STATE_SET);
}
return drawableState;
}
}


まとめ
Andriodの描画をselectorで切り替えるのは便利だけど、
ところどころ特定のViewの中の独自処理で切り替えられているのがあるので、
selectorでやればいいやと信用していると痛い目に遭う、、と。
勘弁してよ・・・(´・ω・)


今回のテストコードはこちら
ListViewTest.zip(Eclipseのプロジェクト)

  |  0 trackbacks   |  このエントリーのURL   |  related link   |   ( 3.1 / 166 )

Debian Linux(Lenny)とHT-03Aの接続トラブル 
日曜日, 7月 11, 2010, 03:49 PM - Android
Debian Linux(Lenny)でAndroid SDKを触っていて、
USB接続のHT-03Aをddmsから見ようとすると
例外が出て見れない現象が起こった。

37:32 E/DDMS: device (????????????) request rejected: insufficient permissions for device
java.io.IOException: device (????????????) request rejected: insufficient permissions for device
at com.android.ddmlib.AdbHelper.setDevice(AdbHelper.java:726)
at com.android.ddmlib.AdbHelper.executeRemoteCommand(AdbHelper.java:363)
at com.android.ddmlib.Device.executeShellCommand(Device.java:280)
at com.android.ddmuilib.SysinfoPanel.loadFromDevice(SysinfoPanel.java:156)
at com.android.ddmuilib.SysinfoPanel.deviceSelected(SysinfoPanel.java:123)
at com.android.ddmuilib.SelectionDependentPanel.deviceSelected(SelectionDependentPanel.java:52)
at com.android.ddms.UIThread.selectionChanged(UIThread.java:1662)
at com.android.ddmuilib.DevicePanel.notifyListeners(DevicePanel.java:753)
at com.android.ddmuilib.DevicePanel.notifyListeners(DevicePanel.java:741)
at com.android.ddmuilib.DevicePanel.access$1100(DevicePanel.java:56)
at com.android.ddmuilib.DevicePanel$1.widgetSelected(DevicePanel.java:360)
at org.eclipse.swt.widgets.TypedListener.handleEvent(Unknown Source)
at org.eclipse.swt.widgets.EventTable.sendEvent(Unknown Source)
at org.eclipse.swt.widgets.Widget.sendEvent(Unknown Source)
at org.eclipse.swt.widgets.Display.runDeferredEvents(Unknown Source)
at org.eclipse.swt.widgets.Display.readAndDispatch(Unknown Source)
at com.android.ddms.UIThread.runUI(UIThread.java:484)
at com.android.ddms.Main.main(Main.java:105)


どうやらUSB接続を見るのに権限が足りていないようだ。
よくよく考えれば大抵のデバイスはrootでないと
接続できないので当然といえば当然だ。

で、調べてみると本家のサイトにも記載があった。
Setting up a Device for Development

このサイトの通り、/etc/udev/rules.d/51-android.rulesを作って、
# For Gusty/Hardy, edit the file to read:
SUBSYSTEM=="usb", SYSFS{idVendor}=="0bb4", MODE="0666"
# For Dapper, edit the file to read:
SUBSYSTEM=="usb_device", SYSFS{idVendor}=="0bb4", MODE="0666"

chmodしてudevを再起動して、
# chmod a+r /etc/udev/rules.d/51-android.rules
# /etc/init.d/udev reload

HT-03Aを差し直した。

・・・

でも相変わらず見えないままだった・・・。
様子からすると権限が正しく見えてない様子。
ふと思ってudevのrulesを"usb"でgrepをかけると・・・
/etc/udev/rules.d# grep -H "usb" *.rules

(略)
51-android.rules:SUBSYSTEM=="usb", SYSFS{idVendor}=="0bb4", ATTRS{idProduct}=="0c02", MODE="0666"
51-android.rules:SUBSYSTEM=="usb_device", SYSFS{idVendor}=="0bb4", ATTRS{idProduct}=="0c02", MODE="0666"
(略)
91-permissions.rules:SUBSYSTEM=="usb_device", MODE="0664"
(略)


91-permissions.rulesで上書きしてるがな・・・(´・ω・)
というわけで51-android.rules→92-android.rulesにリネームすることで対処した。

やっと実機でデバッグができる。
しかしディストリビューションごとのこの辺りの差異は厄介だなぁ。

  |  0 trackbacks   |  このエントリーのURL   |  related link   |   ( 3 / 849 )


Back Next