標準のカメラアプリケーションでは、カメラで撮影した画像のファイル名を重複しないようにするために、

以下のように、日時をキーとしてファイル名を決めているようです。

SimpleDateFormat クラスを使用すると、簡単に書式化できるんですね。

 

サンプルコード

SimpleDateFormat simpleDateFormat = new SimpleDateFormat(
    "'IMG'_yyyyMMdd_HHmmss'.jpg'");
String fileName = simpleDateFormat.format(
    new Date(System.currentTimeMillis()));

// 出力結果
// 2010年8月4日22時34分56秒の場合 -> 「IMG_20100804_223456.jpg」
Log.v("FileName", fileName); 

モデル名

Build.MODEL の値は、以下のとおりです。

  • "JN-DK01" : Android向けソフトウェア開発者向け専用端末JN-DK01
  • "IS01" : IS01 (au by KDDI)
  • "SH-10B" : LYNX SH-10B (NTT docomo)

 

エミュレーター起動オプション

JN-DK01 のエミュレーターは、標準のエミュレーターと異なる起動オプションが必要です。

※@JDK01の部分は、各々の環境に応じて読み換えてください

emulator @JNDK01 -qemu --cpu cortex-a8

 

また、エミュレーター画面を縮小するには、-scale を付加することでできます。

※以下は、75%表示の例

emulator @JNDK01 -scale 0.75 -qemu --cpu cortex-a8

 

Eclipse 上でエミュレーターのオプションを設定するには、

対象プロジェクトの「Properties」 > 「Run/Debug Settings」 > 任意のLaunch configurations >

「Edit」 > 「Target」 > 「Automatic」 > 「Additional Emulator Command Line Options」、

のエディットボックスに設定します。

configuration.png

 

エミュレーターからネットワークに接続する

2010/7/31現在、標準の設定アプリケーションからネットワーク設定を行うことができません。

しかしながら、以下のように net.dns1 プロパティに DNS サーバーのアドレスを設定することで、

この問題を回避できるようです。

※例えば、google の DNS サーバーを利用する場合

setprop net.dns1 8.8.8.8

 

あわせて読みたい

java.security パッケージに含まれる SecureRandom クラスを使用すると、

任意の長さを指定してランダムバイト配列を取得することができます。

 

サンプルソースコード

byte bytes[] = new byte[20];
SecureRandom secureRandom = new SecureRandom();
secureRandom.nextBytes(bytes);
// または
bytes = secureRandom.generateSeed(20);

 

参考

SQLiteDatabase を使って Bitmap 画像を読み書きしてみました。

データ型に、Bitmap 型は存在しないので、Blob 型(バイナリラージオブジェクト)を使用しました。

get/set で Bitmap を読み書きできます。

 

サンプルソースコード

public class BitmapDB extends SQLiteOpenHelper {

    private static final String NAME = "bitmap.db";
    private static final int VERSION = 1;

    private static final String TABLE = "bitmap";
    private static final String _ID = "_id";
    private static final String URL = "url";
    private static final String BITMAP = "bitmap";

    private static final String[] COLUMNS = { _ID, URL, BITMAP };

    public BitmapDB(Context context) {
        super(context, NAME, null, VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL("CREATE TABLE IF NOT EXISTS " + TABLE + " (" // 
                + _ID + " INTEGER PRIMARY KEY AUTOINCREMENT," //
                + URL + " TEXT NOT NULL," //
                + BITMAP + " BLOB NOT NULL" //
                + ");");
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        db.execSQL("DROP TABLE IF EXISTS " + TABLE);
        onCreate(db);
    }

    private synchronized void setCacheAsBlob(String key, byte[] bytes) {
        boolean exist = (getCacheAsBlob(key) == null) ? false : true;
        SQLiteDatabase db = getWritableDatabase();
        ContentValues values = new ContentValues();
        values.put(URL, key);
        values.put(BITMAP, bytes);
        if (exist) {
            db.update(TABLE, values, URL + "=" + "'" + key + "'", null);
        } else {
            db.insert(TABLE, null, values);
        }
        db.close();
    }

    private synchronized byte[] getCacheAsBlob(String key) {
        byte[] bytes = null;
        final SQLiteDatabase db = getReadableDatabase();
        final Cursor cursol = db.query(TABLE, COLUMNS, URL + "=" + "'" + key
                + "'", null, null, null, null);
        if (cursol.getCount() == 1) {
            if (cursol.moveToFirst()) {
                bytes = cursol.getBlob(2);
            }
        }
        cursol.close();
        db.close();
        return bytes;
    }

    public Bitmap getBitmp(String url) {
        Bitmap bitmap = null;
        byte[] bytes = getCacheAsBlob(url);
        if (bytes != null) {
            bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
        }
        return bitmap;
    }

    public void setBitmap(String url, Bitmap bitmap) {
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
        if (bitmap.compress(Bitmap.CompressFormat.PNG, 100,
                byteArrayOutputStream)) {
            byte[] bytes = byteArrayOutputStream.toByteArray();
            setCacheAsBlob(url, bytes);
        }
    }

}

 

大量の画像が存在した場合、任意のファイルを検索して、ファイルで直接読み書きするのと、どちらが高速なんですかね?

もっとよい方法をご存じの方、お待ちしております^^;

android_market_dda.png

Android マーケットのデベロッパー販売/配布契約書(DDA)が更新されました。

 

公式の「Android Developers Blog」では、「13.1」「13.2」についてコメントが記載されていました。

http://android-developers.blogspot.com/2010/07/adjustment-to-market-legals.html

 

13. 補償

  • In Section 13.1, "authorized carriers" have been added as an indemnified party.
    法律で認められる最大限の範囲内において、
    デベロッパーは、(a)デベロッパーが本契約に違反してマーケットを使用したこと、
    および(b)デベロッパーの対象製品が他者の何らかの著作権、商標権、
    営業秘密、トレード ドレス、特許権、もしくはその他の知的財産権を侵害していること、
    または他者の名誉を毀損している、もしくは他者のパブリシティ権
    もしくはプライバシーを侵害していることから発生したあらゆる第三者からの申し立て、
    普通法上の訴訟、衡平法上の訴訟、または法的手続き、
    ならびにあらゆる損失、責任、損害、費用、および経費
    (合理的な弁護士報酬を含む)について、Google、その関連会社、
    ならびに当該各社の取締役、役員、従業員、代理人および認定携帯通信会社を防御し、
    補償し、免責することに同意します。
    →認定携帯通信会社を追加

 

  • Section 13.2 is new in its entirety, covering indemnity for payment processors for claims related to tax accrual.
    法律で認められる最大限の範囲内において、
    ディベロッパーが マーケットを通じて販売 / 配布したことから発生した
    税に関する あらゆる第三者からの申し立て、 普通法上の訴訟、衡平法上の訴訟、
    または法的手続き、ならびにあらゆる損失、責任、損害、費用、および経費
    (合理的な弁護士報酬を含む)について、
    ディベロッパーは 支払い処理業者 ( Google, または 第三者を 含む ) 、
    支払い業者の 関連会社、取締役、役員、従業員、および代理人 を防御し、
    補償し、免責することに同意します 。
    →「13.2」新設

 

また、Planet Android 経由で見つけた以下の海外サイトでは、

「3.2」「4.5」「7」についても、コメントされていました。

http://www.stealthcopter.com/blog/2010/07/google-updates-its-android-market-developer-distribution-agreement/

 

なお、新しい契約条件は、http://market.android.com/publish/ddaUpdate にアクセスすることで確認できます(要 開発者登録)。

IS01.png

IS01(JN-DK01)で電池残量更新間隔を確認した結果、

一般的な 1% 間隔ではなく、10% 間隔であることがわかりました。

つまり、システムからは、100%→90%→80%...のように、10% 間隔でのみ更新情報が届きます。

したがって、10% 分の電池を消費、または充電する時間が長い場合、

電池残量が更新されていないように感じることがあるかもしれませんが、

端末側の仕様のため、ご理解ください^^;

 

調査したアプリケーション

  • 標準の電池残量表示 (プリインストールアプリ)
  • Battery Status Free (海外アプリ)
  • Simple Battery Status (国内アプリ)

 

※他にも、海外の Milestone / DROID 端末も、電池残量更新間隔は、10% 間隔のようです

※調査に協力していただいた @lychee さん、@hyoromo さん、ありがとうございました!

 

追記

  • 2010/7/28:公式の回答でも10%間隔であることを確認できました

元ネタは、以下のサイトから。

 

Preferenceをリセットする - 明日の鍵

http://d.hatena.ne.jp/tomorrowkey/20100721/1279700859

 

プリファレンスを使用するアプリケーションを作成していると、テスト用に、プリファレンスデータをリセットしたくなります。

実際、ワタクシも、毎回アプリケーションをアンインストールしていた人です。。。

 

そこで、プリファレンスをリセット(というより削除)するには、上記エントリのようにすれば、目的を達成できます。

ありがたいですね。

 

で、自分でもプリファレンスデータをリセットする方法を考えてみました。

ちょっと真面目すぎるコードですが、"/data/data"~"/shared_prefs/"の部分をハードコードしてない点がポイントです。

 

プリファレンスをリセット(削除のみ)するソースコード(※1) 

SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);
SharedPreferences.Editor editor = sharedPreferences.edit();
Map<String, ?> keys = sharedPreferences.getAll();
if (keys.size() > 0) {
    for (String key : keys.keySet()) {
        editor.remove(key);
    }
    editor.commit();
}

 

あと、プリファレンスがデフォルト値を持っていない場合には、これでも良いのですが、

デフォルト値を持っている場合には、続けて、明示的にデフォルト値を作成してあげる必要があります。

※ちなみに、デフォルト値を書き出したかどうかは、/data/data/パッケージ名/shared_prefs/_has_set_default_values.xml の _has_set_default_values キー値に保存されています

 

明示的にデフォルト値を書き出すソースコード

PreferenceManager.setDefaultValues(this, R.xml.preference, true);

 

お題が与えられて一緒に考えるのは楽しいし、勉強になりますね。

 

※1:2010年7月22日追記

SharedPreferences.Editor#clear()→commit() で簡単に削除できるようです^^;

http://d.hatena.ne.jp/ytRino/20100722/1279762434

Android NDK, r4b がリリースされました(2010年7月15日)。

http://developer.android.com/sdk/ndk/index.html

 

CHANGED.TXT によると、

This release fixes a few bugs in r4 scripts. There are no new features.

ということで、

このリリースは、Android NDK, r4 のバクフィックスが目的であり、新しい機能追加は無いようですが、

Android NDK, r4 をお使いの方は、更新された方が良さそうです。

 

以下、CHANGED.TXT の引用です。

 

OTHER FIXES & CHANGES

  • build/tools/rebuild-all-prebuilt.sh: mktemp expects 'XXXXXX' instead of 'XXX'.
    Fix the script (and others in the same directory) to do that properly.
  • ndk-gdb: check the target device's API level, and dump an error message if
    it is not at least 8 (Android 2.2 a.k.a. Froyo). Fix script to properly
    remove control characters like '\r' from adb shell's output. Also fix
    script to work properly with OS X's BSD awk.
  • ndk-build: Make AndroidManifest.xml optional. Now the build scripts will try
    to look for jni/Android.mk if no manifest is found. If you don't use this,
    you can also define NDK_PROJECT_PATH to point to your tree.
    Also, on Windows, check that a Cygwin-compatible make executable is being
    used, and dump a readable help message to solve the issue if this is not
    the case.
  • Place generated binaries under $PROJECT_PATH/obj/ instead of
    $PROJECT_PATH/bin/ndk/. The 'bin' directory is sometimes cleaned
    by the JDT, resulting in the inability to properly load symbol versions
    of the shared libraries when running ndk-gdb.
  • Warn when sources with unsupported extensions are used in LOCAL_SRC_FILES.
    Previous behaviour was to silently ignore them.
  • Set the optimization mode to 'debug' automatically if the manifest sets
    android:debuggable to 'true'. You can override this by using
    'APP_OPTIM := release' in your Application.mk, or by adding '-O2' to
    your LOCAL_CFLAGS.

Note that even in release mode, the NDK build scripts will produce
binaries with symbols under obj/local/<abi>/ that will be used for
debugging with gdb. However, the debugger will have a harder time to
print proper local variable values that have been optimized out or
even set breakpoints properly.

[Android] キセカエADVANCE

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

「キセカエADVANCE」とは、Android のホーム画面のデザインを簡単に着せ替えできるホームアプリケーションです。

 

特徴

  • テーマを選択することにより、壁紙、アイコン、ドロワーなどを一括で変更できます
  • テーマを簡単にダウンロードできます
  • ホーム画面を5画面に拡張できます
  • ウィジェットのセル数を 4x4 から 4x6 に拡張できます

 

ホームの機能としてはシンプルですが、一括でデザインを変更できるのがいいですね。

コンテンツについては、準備中のものも含めて、100 のテーマがありました。

最初に聞いた際には、「100 もあって凄いなぁ~」と思ったのですが、

いざ、カテゴリー単位で選択していくと、少し足りないかなぁという印象でした^^;

今後のテーマの拡充と、ドロクリのように誰でも参加できる仕組みがあれば・・・と思います。

リリースお疲れ様でした!

 

以下、画面キャプチャーです。

AndroidMarket.png Home.png

100DESIGN.png Theme.png

 

Eclipse 上の LogCat では、日本語文字列の文字化けを回避できない?ようですが、

コマンドプロンプト上では、コードページと画面のフォントを変更することで、文字化けを回避できるようです。

 元ネタは以下のサイトから。

 

 

以下、おまけで、上記設定をショートカットで起動するための手順です。

 

ショートカット作成手順 

1. デスクトップを右クリックし、「新規作成」→「ショートカット」をクリックする。

step1.png

 

2. 「ショートカットの作成」画面が表示されたら、[参照]ボタンを押して、

 Windowsのシステムフォルダ下にある「Cmd.exe」を選択し、「次へ」をクリックする。

step2.png

 

3. ショートカットの名前を入力するエディットボックスに任意の名前(例えば、「logcat」)を入力し、「完了」をクリックする。

step3.png

 

4. 作成されたショートカットを右クリックし、「プロパティ」をクリックする。

step4.png

 

5. 「ショートカット」タブのリンク先に「 /k "chcp 65001 & adb logcat"」を追加する。

step5.png

 

6. 「フォント」タブを表示し、「フォント」リストから「MS ゴシック」を選択する。

step6.png

 

以上でショートカットの作成は完了です。

次回から、ショートカット起動で、日本語表示できます。

<<前のページへ 678910111213141516

2014年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