2012年12月7日金曜日

[Android]アプリケーションのキャッシュに保存する

アプリで取得したデータを永続的にキャッシュしておきたい場合には、
アプリケーションのキャッシュに保存しておきましょう。

Context.openFileInput()

http://developer.android.com/reference/android/content/Context.html#openFileInput(java.lang.String)

使い方1:データ読み出し
InputStream in = context.openFileInput("saveData");

使い方2:画像読み出し

FileInputStream is = context.openFileInput(dataName);
Bitmap image = BitmapFactory.decodeStream(is);
is.close();



Context.openFileOutput()

http://developer.android.com/reference/android/content/Context.html#openFileOutput(java.lang.String, int)

使い方1:データ保存
FileOutputStream os = context.openFileOutput("saveData", Context.MODE_PRIVATE);

int DEFAULT_BUFFER_SIZE = 1024 * 4;
byte[] buffer = new byte[DEFAULT_BUFFER_SIZE];
int n = 0;
while (-1 != (n = in.read(buffer))) {
os.write(buffer, 0, n);
}
os.close();


使い方2:画像保存

FileOutputStream os = context.openFileOutput(dataName, Context.MODE_PRIVATE);
ret = image.compress(Bitmap.CompressFormat.PNG, 100, os);

os.cloase();


永続的でなく一時的に保存したい場合は、こちらに保存するのもアリです。
Context.getCacheDir()
http://developer.android.com/reference/android/content/Context.html#getCacheDir()

ファイル容量少なくなると、システムがファイル消してしまうので、その点のみ注意。

2012年12月4日火曜日

[Android]ダイアログ作成コピペ

ダイアログ作成処理をActivityのライフサイクルに乗せる用のコピペ。
自分でダイアログ表示してもいいですが、メモリリークするので、
ライフサイクルに乗せた方がベターです。


==============
Before
==============
// メソッド呼ばれたらその場でダイアログ表示する
    private Dialog createErrorDialog() {
        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        builder.setTitle(R.string.dialog_title)
            .setMessage(R.string.dialog_message_error)
            .setPositiveButton(R.string.dialog_button_ok, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
if(which == DialogInterface.BUTTON_POSITIVE) {
dialog.dismiss();
}
}
});
        builder.create().show();
    }
==============


==============
After
==============
final int DIALOG_ERROR_1 = 1;
    @Override
    protected Dialog onCreateDialog(int id) {
        switch (id) {
        case DIALOG_ERROR_1:
            return createErrorDialog();
        default:
            return null;
        }
    }

// メソッド呼ばれたら、Dialog作成
    private Dialog createErrorDialog() {
        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        builder.setTitle(R.string.dialog_title)
            .setMessage(R.string.dialog_message_error)
            .setPositiveButton(R.string.dialog_button_ok, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
if(which == DialogInterface.BUTTON_POSITIVE) {
dialog.dismiss();
}
}
});
        return builder.create();
    }


// ボタンクリックされたら、ダイアログ表示
button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// ダイアログ表示
showDialog(DIALOG_ERROR_1);
}
});

2012年12月3日月曜日

[Android]着信音ダイアログを表示する


着信オンダイアログを表示する方法
Intent intent = new Intent(RingtoneManager.ACTION_RINGTONE_PICKER);
startActivityForResult(intent, REQUEST_CODE_RINGTONE_PICKER);




選択結果はonActivityResultで受け取ります。


@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data){
    if(requestCode == REQUEST_CODE_RINGTONE_PICKER ){
        if(resultCode == RESULT_OK){
            Uri uri = data.getParcelableExtra(RingtoneManager.EXTRA_RINGTONE_PICKED_URI);
            if(uri != null) {
                ringtone = RingtoneManager.getRingtone(this, uri);
                if(ringtone != null) {
               uri.toString();// 着信音のパス
               ringtone.getTitle(this);// 着信音の名前
                }
            } else {
                // サイレント
            }
        }
    }
}

2012年11月28日水曜日

[Android]ImageViewの後始末

ImageViewは画像を表示するのに使いますが、
終了時にちゃんとメモリ解放処理いれてあげないと、
大きい画像を扱ったりすると、すぐにメモリ不足おきてしまいます。

使うとき

imageView.setImageResource(resId);
imageView.setImageBitmap(bitmap);
imageView.setImageDrawable(drawable);


使い終わったとき
void cleanup(ImageView view) {
    d = view.getImageDrawable()
    d = null;

    if(bitmap != null) {
        if(!bitmap.isRecycle()) {
            bitmap.recycle();
        }
        bitmap = null;
    }

    imageView.setImageDrawable(null);

    view.setOnClickListener(null);
}



2012年11月26日月曜日

[Android]metaio SDK 3.0 → 4.0にバージョンアップ

metaio Mobile SDK のバージョン4がリリースされました。

というわけで、
SDKを入れ替えましたが、大幅に変わっているので、注意点をいくつか。

1.metaio Mobile SDK がない!?

Download Center に行くと、
metaio Mobile SDK 4.0 が見当たりません。

metaio SDK v4.0.2に統合されたようです。
こちらをダウンロードしましょう。


2.jarの名前が変わっている

jar の名前がmetaiomobilesdk.jar からmetaiosdk.jar になっています。
metaiomobilesdk.jar をビルドパスから外しましょう。
それから、metaiosdk.jar をビルドパスに追加しましょう。


3.クラス名が大幅に変わっている

ARViewActivity.java で使用していた様々なクラス名が変更されています。
一つずつ置き換えていきましょう。


4.シグネチャの変更が必要。

metaio Developer Console でシグネチャ登録しましたが、
4.0 に変更した場合、再度シグネチャを取得する必要があります。


5.トラッキングデータの変更


今までのも使えますが、ここも名前が変わっています。

2012年11月25日日曜日

[Android]トレーニング

Android公式でトレーニングなる項目を見つけた。
いろんなサンプルコードを解説してくれてます。
http://developer.android.com/intl/ja/training/index.html

2012年11月22日木曜日

[Android]SQLiteOpenHelperでDBバージョンを上げる時に、列を追加する方法


SQLiteOpenHelperでDBバージョンを上げる時に、列を追加する方法です。

onUpgrade()で古いバージョン、新しいバージョンが分かるので、
古いバージョンのときに処理を行うようにします。
(今回の場合は、1 -> 2にバージョン上げたと仮定します)

db.execSQLで、
列追加のSQLコマンドを実行すればOK。

ALTER TABLE テーブル名 add 追加する列名 型名


@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
try {
if(oldVersion == 1) {
db.execSQL( "ALTER TABLE " + DB_TABLE_NAME + " add " + ADD_COLUM_NAME + " TEXT;");
}
} catch (Exception e) {
e.printStackTrace();
}
}