ラベル Android の投稿を表示しています。 すべての投稿を表示
ラベル Android の投稿を表示しています。 すべての投稿を表示

2011年5月19日木曜日

AndroidのWebViewがhttpsでloadUrlすると真っ白になる件

Froyo以前のバージョンでは信頼できない証明書を受け入れるかどうかを選択する方法が提供されていないらしい。

しかも、警告も何もなしに読み込みを停止しちゃうので真っ白になる。

その解決方法がプライベートAPIを使ったものなのだけど、プライベートAPIの使い方が、「え?それでいいの?」って感じ。

Android WebView with https loadUrl shows blank/empty page

2011年4月8日金曜日

AndroidでSystem.outとSystem.errをLogに転送する

Androidでは、System.outとSystem.errがLogに転送されているけれど、
任意のプライオリティと任意のタグでLogに転送するコードを作ってみた。

ついでに、はじめてGistを使ってみた。

Gistで保存するコードの先頭には、コピーライトとか書かない方がいいのかもなぁ。



おもいっきりプライベートなAPI使ってるから良くない子に分類されるだろう。

2011年3月31日木曜日

JavaでJSONしたい

JavaでJSONを扱うためのライブラリはたくさんあるなぁ

どれを使ったらいいんだろう?

ちょっと古い記事だけど、A Review of 5 Java JSON Libraries が参考になりそう。

この記事で取り上げているのは次の5つ。

  1. org.json
  2. Jackson
  3. XStream
  4. JsonMarshaller
  5. JSON.simple

www.json.orgに18ものライブラリが掲載されていると書いてあるが、
その中からどういう基準で5つを選んだのか気になるところ。

それでも、これらの中のどれかを状況に合わせて選択すれば今を生きていくには十分だろう。

「とりあえずJSON使っておく?」
みたいな状況だったら JSON.simple を使えば良さそう。

ころで、AndroidのSDKにはorg.json.JSONObjectなどが用意されている。
パッケージ名から類推して org.json のコードが使われているのかと思っていたら間違いだった。

[platform/libcore.git] / json / src / main / java / org / json / JSONObject.java
ここのソースのコメントに、

// Note: this class was written without inspecting the non-free org.json sourcecode.

と書いてある。
オリジナルってことかな?

2011年2月28日月曜日

AndroidでRSAを使ってみた

RSAでの暗号化と復号化のシンプルなサンプルコードを書いてみた。

    public static byte[] encrypt(byte[] data)
            throws
                InvalidKeySpecException,
                NoSuchAlgorithmException,
                NoSuchPaddingException,
                InvalidKeyException,
                IllegalBlockSizeException,
                BadPaddingException
    {
        final Key publicKey =
            KeyFactory
            .getInstance("RSA")
            .generatePublic(new X509EncodedKeySpec(PUBLIC_KEY_BYTES));
        final Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
        cipher.init(Cipher.ENCRYPT_MODE, publicKey);
        return cipher.doFinal(data);
    }
    public static byte[] decrypt(byte[] data)
            throws
                InvalidKeySpecException,
                NoSuchAlgorithmException,
                NoSuchPaddingException,
                InvalidKeyException,
                IllegalBlockSizeException,
                BadPaddingException
    {
        final Key privateKey =
            KeyFactory
            .getInstance("RSA")
            .generatePrivate(new PKCS8EncodedKeySpec(PRIVATE_KEY_BYTES));
        final Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
        cipher.init(Cipher.DECRYPT_MODE, privateKey);
        return cipher.doFinal(data);
    }

ポイントは、Cipherのインスタンスを取得するときに、
フィードバックモードとパディングをちゃんと指定すること。

Cipher.getInstance("RSA") // これは悪い例!

同じJavaVM環境なら、こうやって書いても期待通りに動いてしまう。

フィードバックモードおよびパディングを省略すると、
プロバイダ固有のデフォルト値が使われると書いてある

同じJavaVM環境ならプロバイダーが同じだからデフォルト値も同じなので問題がないというわけ。

ところが、
Sun(Oracle)のJREやJDKにバンドルされているJCEプロバイダのデフォルトはSunJCEで、
Androidの場合はBouncyCastleのようだ。

SunJCEの場合
"RSA"は"RSA/ECB/PKCS1Padding"
がデフォルトみたい。

BouncyCastleの場合は
"RSA"は"RSA/None/NoPadding"
がデフォルトみたい。

これらはたまたま手元の環境で動かしたらそうなっただけで、
デフォルト値が未来永劫変わらない保証はない。

というわけで、フィードバックモードとパディングを省略すると
サーバとAndroid端末の間で渡したデータを復号化できなくなると思った方がよい。

2011年1月26日水曜日

Android Screenshots, Screen Capture, Screen Cast

これは便利だ。

USB接続したAndroidの画面をどんどんキャプチャ―してPNGに保存してくれる。

Android Screenshots, Screen Capture, Screen Cast



AndroidScreenCapture-1.1.zipをダウンロードして実行。

android-sdk_r08-windows.zipでは動かない。
android-sdk_r07-windows.zipを使ったら動いた!
sdkのディレクトリ構造が変わったのが原因だろうな。

ダウンロードはsourceforgeから。

2011年1月13日木曜日

Google APIsとGALAXY Tabのエミュレータ

android-sdkでSamsung GALAXY Tabのエミュレータを簡単に作成できる。

でも、残念ながらGoogle APIs、たとえばGoogle Maps APIを使ったapkを実行できない。

しかたがないので600x1024サイズのAVDを使うことにする。

Google APIs(Google Inc.) - API Level 8をTargetにしたAVDを作成してから、

~/.android/avd/AVDNAME.avd/config.iniのskin.pathを

add-ons/addon_galaxy_tab_samsung_electronics_8/skins/GALAXY Tab

にすると、GALAXY Tabの画面サイズにできる。

動作に影響はしないみたいだけれどskin.nameもGALAXY Tabにしておいた。

2010年11月30日火曜日

現在のdalvik VMはアプリのヒープを16Mに制限している

http://groups.google.com/group/android-framework/msg/cda4cd5d5da2b2d8 から引用。

the VM currently limits app heaps to 16MB.
This allows for a reasonable number of apps to run.


ふーん。

NTTドコモのAndroid端末のユーザーエージェント

FAQに書いてあった。
【図】答え弊社Android端末標準webブラウザのユーザーエージェントは、下記のとおりとなります。

端末ファームウェア
バージョン
(ビルド番号)
ユーザーエージェント
HT-03AAndroid 1.5Mozilla/5.0 (Linux; U; Android 1.5; ja-jp; HT-03A Build/CDB72)
AppleWebKit/528.5+ (KHTML, like Gecko) Version/3.1.2 Mobile Safari/525.20.1
Android 1.6Mozilla/5.0 (Linux; U; Android 1.6; ja-jp; Docomo HT-03A Build/DRD08)
AppleWebKit/528.5+(KHTML, like Gecko) Version/3.1.2 Mobile Safari/ 525.20.1
Xperia™Android 1.6
(R1EA018)
Mozilla/5.0 (Linux; U; Android 1.6; ja-jp; SonyEricssonSO-01B Build/R1EA018)
AppleWebKit/528.5+ (KHTML, like Gecko) Version/3.1.2 Mobile Safari/525.20.1
Android 1.6
(R1EA025)
Mozilla/5.0 (Linux; U; Android 1.6; ja-jp; SonyEricssonSO-01B Build/R1EA025)
AppleWebKit/528.5+ (KHTML, like Gecko) Version/3.1.2 Mobile Safari/525.20.1
Android 1.6
(R1EA029)
Mozilla/5.0 (Linux; U; Android 1.6; ja-jp; SonyEricssonSO-01B Build/R1EA029)
AppleWebKit/528.5+ (KHTML, like Gecko) Version/3.1.2 Mobile Safari/525.20.1
Android 2.1
(2.0.B.0.138)
Mozilla/5.0 (Linux; U; Android 2.1-update1; ja-jp; SonyEricssonSO-01B Build/2.0.B.0.138)
AppleWebKit/530.17 (KHTML, like Gecko) Version/4.0 Mobile Safari/530.17
LYNX SH-10BAndroid 1.6Mozilla/5.0 (Linux; U; Android 1.6; ja-jp; SH-10B Build/S7023)
AppleWebKit/528.5+ (KHTML, like Gecko) Version/3.1.2 Mobile Safari/525.20.1
GALAXY SAndroid 2.2Mozilla/5.0 (Linux; U; Android 2.2; ja-jp; SC-02B Build/FROYO)
AppleWebKit/533.1(KHTML, like Gecko) Version/4.0 Mobile Safari/533.1
GALAXY TabAndroid 2.2Mozilla/5.0 (Linux; U; Android 2.2; ja-jp; SC-01C Build/FROYO)
AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1

2010年11月17日水曜日

Androidでスクリーンの方向を指定してみたらもやもやした

ゲームとかで画面の表示方向を固定したいことがある。

AndroidManifest.xmlでactivityのscreenOrientation属性で指定する方法が一般的だと思う。

<activity
  ...
  android:screenOrientation="landscape"
  ...>

この指定は実行時に変更することができる。

縦長固定に変える
Activity#setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

横長固定に変える
Activity#setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

システムに決めてもらう
Activity#setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);

「システムに決めてもらう」設定にしておくと、重力センサーなどに従って、自動的に自然な方向に回転したりする。

普通の時は自由に回転させておくけれど、ボタンを押したときには「その時の方向で固定」したいこともある。

public void lockScreenOrientation() {
    switch (getResources().getConfiguration().orientation) {
    case Configuration.ORIENTATION_LANDSCAPE:
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
        break;
    case Configuration.ORIENTATION_PORTRAIT:
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
        break;
    case Configuration.ORIENTATION_SQUARE:
        // ここではどうしたらいい?
        break;
    }
}


世の中には正方形のデバイスもあるらしい。
確かに横長でも縦長でもないけれど、正方形だとしてもデバイスの方向ってやつがあるはずでしょぅ
そう考えると、SQUAREっていう報告は来ないはず…
実機で試してみたいなぁー
あーもやもやする

2010年11月16日火曜日

<application>の直下に<meta-data>を書いてもいいのかもしれない

AndroidManifest.xml<meta-data>の説明では、<meta-data>の親になるのは、

  • <activity>
  • <activity-alias>
  • <service>
  • <receiver>

の4つしか書いてない。

だけど、ApplicationInfoにはmetaDataフィールドがあるし、
実機で検証したところ、期待通りに機能している。

public static Object getAppMetaData(Context context, String key) {
    try {
        final Bundle metaData =
            context
            .getPackageManager()
            .getApplicationInfo(
                context.getPackageName(),
                PackageManager.GET_META_DATA)
            .metaData;
        if (null != metaData) {
            return metaData.get(key);
        }
    } catch (NameNotFoundException e) {
    }
    return null;
}

「動く」けど、ドキュメントに書かれていない、この便利な機能を使ってよいのだろうか?

答えがないかと探していたら、見つけたっぽい。

AdMobのガイド
<application>の子要素で<meta-data>使って"ADMOB_PUBLISHER_ID"をセットしている。

AdMobがこの仕組みを使ってるってことは、だれでも使っていいってことだろう。
いつかドキュメントが更新されるに違いない。
もしも問題になったとしても、解決策がすぐに提案されるだろう。

2010年11月8日月曜日

Androidでアプリ実行中にフルスクリーンにしたりしなかったり

ボタンを押したらフルスクリーンにする。
もうひとつのボタンをおしたら元に戻す。
@Override
 public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.main);

  findViewById(R.id.btnFullScreen).setOnClickListener(new View.OnClickListener() {
   @Override
   public void onClick(View v) {
    getWindow().addFlags(
      WindowManager.LayoutParams.FLAG_FULLSCREEN);
   }
  });
  findViewById(R.id.btnNotFullScreen).setOnClickListener(new View.OnClickListener() {
   @Override
   public void onClick(View v) {
    getWindow().clearFlags(
      WindowManager.LayoutParams.FLAG_FULLSCREEN);
   }
  });
 }

2010年10月21日木曜日

Androidの標準ブラウザで開いたHTMLから自作アプリを起動してみた

通常のアプリのように見えて、
かつ、
ブラウザーからもアプリを起動できるようにするためには、
アクティビティにintent-filterを追加すればよい。

AndroidManifest.xml
<activity
    android:name=".MyActivity"
    android:label="@string/app_name"
    >
    <intent-filter>
        <action android:name="android.intent.action.MAIN"/>
        <category android:name="android.intent.category.LAUNCHER"/>
    </intent-filter>
    <intent-filter>
        <action android:name="android.intent.action.VIEW"/>
        <category android:name="android.intent.category.DEFAULT"/>
        <category android:name="android.intent.category.BROWSABLE"/>
        <data android:scheme="hello" android:host="world"/>
    </intent-filter>
</activity>

HTMLには
<a href="hello://world/">起動</a>
こんなリンクを用意する。

ブラウザーから起動された場合、getIntent().getData()でUriを取得することができる。
アクティビティが普通に起動されたときには、getData()はnullを返す。


2010年8月31日火曜日

画像でボタンを作る方法

これまでスタイルで指定する方法を使っていたけれど、よりよい方法を見つけた。
スタイルで指定するとEclipseのLayoutエディタではプレビューできなかった。
でも、以下の方法ならばプレビューもちゃんとできる。

まず、画像を3つ用意する。
  • 通常時の画像。
  • トラックパッドなどで選択されている時の画像。
  • タッチされている時の画像。
例えばこんな感じ。
res/drawable/normal.png
res/drawable/focused.png
res/drawable/pressed.png

次に、ボタンの状態に応じて表示するものが変わるdrawableをxmlで作成する。

drawable/button.xml
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/focused" android:state_focused="true"/>
    <item android:drawable="@drawable/pressed" android:state_pressed="true"/>
    <item android:drawable="@drawable/normal"/>
</selector>


そしてボタンに適用する。

layoutファイルにて
<Button
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:background="@drawable/button"/>

自作Viewのカスタム属性

MyViewという名前で自作Viewを作り、カスタム属性helloを作る方法のメモ。

まず res/values/attrs.xml を作って属性を定義する。

res/values/attrs.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
  <declare-styleable name="MyView">
    <attr name="hello" format="string"/>
  </declare-styleable>
</resources>

これで、R.styleable.MyViewとR.styleable.MyView_helloというフィールドが自動生成される。

次に、MyViewのコンストラクタでカスタム属性を読むコードを書く。

MyView.java
public MyView(Context context, AttributeSet attrs, int defStyle) {
  super(context, attrs, defStyle);

  TypedArray a = context.obtainStyledAttributes(
    attrs, R.styleable.MyView, defStyle, 0);
  this.hello = a.getString(R.MyView_hello);
  a.recycle();
}

MyViewを使う時は、属性のために名前空間を宣言する。

layout/main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:takumak="http://schemas.android.com/apk/res/[Rクラスのパッケージ名]"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent">
  <com.blogspot.takumakei.lib.MyView
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    takumak:hello="hello world"/>
</LinearLayout>

参考にした情報

2010年8月30日月曜日

Galaxy Sは魅力的な端末だった

たまたま実機に触れるチャンスがあった。
反応が速くて素敵。
有機ELディスプレイも綺麗だし。
すごい魅力的。

2010年8月18日水曜日

SIMとICCIDとIMSIとIMEI

ICCIDとはIC Card IDのこと。SIMカード固有の番号。
SIMカードとはSubscriber Identity Module Cardのこと。
加入者識別番号モジュールカード。

android.telephony.TelephonyManager#getSimSerialNumberでICCIDを取得可能。

IMSIとはInternational Mobile Subscriber Identityのこと。

国際移動体加入者識別番号。
キャリアがSIMに割り当てた識別番号。
携帯電話の通信ではIMSIが電話番号の役割を担う。
IMSIは再利用される可能性がある。
IMSIは滅多に送信されることがないらしい。

IMEIはInternational Mobile Equipment Identifierのこと。
国際移動体装置識別番号。
端末に割り当てられた番号。
*#06#と入力すると携帯電話の画面に表示できる。


TelephonyManagerのインスタンスは、
READ_PHONE_STATEパーミッションが必要。

2010年8月17日火曜日

みたことあるAndroid端末のUser Agentたち

HT-03A
Mozilla/5.0 (Linux; U; Android 1.6; ja-jp; Docomo HT-03A Build/DRD08) AppleWebKit/528.5+ (KHTML, like Gecko) Version/3.1.2 Mobile Safari/525.20.1

X06HT Desire
Mozilla/5.0 (Linux; U; Android 2.1-update1; ja-jp; HTC Desire Build/ERE27) AppleWebKit/530.17 (KHTML, like Gecko) Version/4.0 Mobile Safari/530.17

SO-01B XPERIA
Mozilla/5.0 (Linux; U; Android 1.6; ja-jp; SonyEricssonSO-01B Build/R1EA018) AppleWebKit/528.5+ (KHTML, like Gecko) Version/3.1.2 Mobile Safari/525.20.1

IS01
Mozilla/5.0 (Linux; U; Android 1.6; ja-jp; IS01 Build/S7070) AppleWebKit/528.5+ (KHTML, like Gecko) Version/3.1.2 Mobile Safari/525.20.1

2010年4月17日土曜日

Xperia X10とWindows 7 64bit の USBドライバ(SDKのドライバをロードする方法)

android_winusb.infを修正しておくだけ。


android_winusb.inf.patch
--- android_winusb.inf.orig     2010-04-17 22:36:28.789163200 +0900
+++ android_winusb.inf  2010-04-17 23:24:14.522073700 +0900
@@ -26,6 +26,9 @@
 %ProviderName% = Google, NTx86, NTamd64

 [Google.NTx86]
+; Xperia X10
+%SingleAdbInterface%        = USB_Install, USB\VID_0FCE&PID_D12E
+%CompositeAdbInterface%     = USB_Install, USB\VID_0FCE&PID_D12E&MI_01
 ; HTC Dream
 %SingleAdbInterface%        = USB_Install, USB\VID_0BB4&PID_0C01
 %CompositeAdbInterface%     = USB_Install, USB\VID_0BB4&PID_0C02&MI_01
@@ -44,6 +47,9 @@
 %CompositeAdbInterface%     = USB_Install, USB\VID_18D1&PID_4E12&MI_01

 [Google.NTamd64]
+; Xperia X10
+%SingleAdbInterface%        = USB_Install, USB\VID_0FCE&PID_D12E
+%CompositeAdbInterface%     = USB_Install, USB\VID_0FCE&PID_D12E&MI_01
 ; HTC Dream
 %SingleAdbInterface%        = USB_Install, USB\VID_0BB4&PID_0C01
 %CompositeAdbInterface%     = USB_Install, USB\VID_0BB4&PID_0C02&MI_01

2010年4月1日木曜日

Xperia X10とWindows 7 64bit の USBドライバ

Xperia X10をWindows 7 64bitに認識してもらえなくて困ってた。
いろいろぐぐってようやく見つけた

正解はPdaNet for Androidのインストールを途中までやること。

手順はたぶん次のようだったと思う。

  1. Xperia X10はPCから接続をはずしておく。
  2. PdaNetの64bit用のインストーラを起動して、「Androidをデバッグモードにしてつなげ」というダイアログが出るところまで進める。
  3. Xperia X10をデバッグモードにして、PCとUSBケーブルと接続する
  4. ダイアログのOKで先に進む。(ここでドライバのインストールに成功する)
  5. モデム用のデバイスドライバをインストールするかどうか聞いてくるので、 No と言う。
  6. するとインストーラはインストールに失敗したとみなしてインストールをキャンセルしてロールバックしてくれる。



ちなみに、
PdaNetを見つける前にフォーラムで見つけたX10.zipというのではダメだった。
32bit用なのだろうか?

2009年7月24日金曜日

Androidのタイトルバーにアイコンを表示してみた

import android.view.Window;
Window w = getWindow();
w.requestFeature(Window.FEATURE_LEFT_ICON);
setContentView(R.layout.search);
w.setFeatureDrawableResource(Window.FEATURE_LEFT_ICON, R.drawable.icon);
とっても簡単。
Window.FEATURE_???を調べたらいろいろできることが増えるのかも。