SharedPreferences ~セーブとロード

 ゲームなんかのプレイ・データを保存するには、SharedPreferences がラクでいいね。
 扱いも簡単だし、書き込み/読み込み順番とか気にしなくてもいい。

データの書き込み

 下記、例では指定したファイル(xmlName)に、3つのデータを書き込んでいる。

	// write
	public void write_xml( String xmlName ,int i, String key, String key2 ) {
		// MODE_WORLD_READABLE:他のアプリから読み取り可能
		// MODE_WORLD_WRITEABLE:他のアプリから書込み可能
		// MODE_PRIVATE:当アプリのみ使用可能

		SharedPreferences pref =
			getSharedPreferences( xmlName, MODE_WORLD_READABLE | MODE_WORLD_WRITEABLE );
		Editor edit = pref.edit();
		
		edit.putInt( "score", i );
		edit.putString( "key", key );
		edit.putString( "key2", key2 );
		
		edit.commit();
	}

 まず、getSharedPreferences で、書き込むファイルを取得する。
 引数のxmlName には、xmlのファイル名を指定する。
 ただし、拡張子はつけない。
 pref.xml だとしたら、”pref” となる。

 次に、Editor を取得する。
 書き込みは、このEditor を介して行われる。

 書き込み内容の設定は、putInt などを使う。

	edit.putInt( "score", i );
		第一引数 : データ名
		第二引数 : データの値

 putIntの他にも、putString, putBoolean, putLong, putFloat が使える。

 設定をしたら、commit() でファイルに書き込む。

 ちなみに、commit() と同じ役割のapply() がある。
 違いは結果を返すか、返さないか。
 commit() だと boolean を返してくれるので、その値を調べれば成功したかがわかる。

データの読み込み

 下記、例では指定したファイル(xmlName)から、3つのデータを読み込んでいる。

	// Read
	public void read_xml( String xmlName ) {
		
		SharedPreferences pref =
			getSharedPreferences( xmlName, MODE_WORLD_READABLE | MODE_WORLD_WRITEABLE );
		
		int i = pref.getInt( "score", 0 );
		String str = pref.getString( "key", "" );
		String str2 = pref.getString( "key2", "" );

	Log.d( "TEST", "read | score :" +i +" key:"+str +" key2:"+str2 );
	}

 手順は、書き込みの時とほぼ同じ。
 method の第二引数は、デフォルト値となる。
 なにかの原因で読み込めなかった場合、この値が返ってくる。

データの削除

 すべてのデータを削除するには、下記のようになる。

	// clear
	public void delete_data( String xmlName ) {
		SharedPreferences pref =
			getSharedPreferences( xmlName, MODE_WORLD_READABLE | MODE_WORLD_WRITEABLE );
		Editor editor = pref.edit();
		editor.clear();	// all clear
		editor.commit();
		//--	
	}

 editor を取得して、clear()。その後、commit() を行う。
 commit() をしないと、反映されないので注意。
 データを指定して消す場合は、remove を使う。

	remove( String key );

 なお、全削除には、xmlファイルごと消してしまう方法もある。
 しかしその場合、すぐには反映されず、アプリの再起動が必要となるようだ。

Posted in File. Tags: , . SharedPreferences ~セーブとロード はコメントを受け付けていません »

ファイルのコピー

 ↓で、できるかと思ったら、できなかった…orz
 File file.renameTo( File newPath );

 じゃ、InputStream で読み込んで、OutputStream で書き出して、読み込んで書き出して…
 と、ループしなきゃならないのか。
 それは面倒…。
 なんて思ってたら、FileChannel を使うとよいらしい。

 下記、例では、アプリのプリファレンスをSDへコピーしている。

	public void cpTo_sd( ) {
		
		File file = new File( Environment.getDataDirectory().getPath()+"/data/" 
				+ this.getPackageName()
				+"/shared_prefs/pref.xml" );

		File cpFile = new File( Environment.getExternalStorageDirectory().getPath()
				+"/pref.xml" );

		try{
			FileChannel channel_In = new FileInputStream( file ).getChannel();
			FileChannel channel_Out = new FileOutputStream( cpFile ).getChannel();

			channel_In.transferTo( 0, channel_In.size(), channel_Out );

			channel_In.close();
			channel_Out.close();

		}catch( Exception ex ){
			Log.d( "TEST", "->sd : copy error..." );
		}
		//--
	}

 FileChannel には、他にもlock や読み込み位置の指定などがあり、色々と使えそうである。
http://developer.android.com/reference/java/nio/channels/FileChannel.html

Posted in File, コピー. Tags: , , , . ファイルのコピー はコメントを受け付けていません »

dataディレクトリの取得・他 (Environment)

 Androidアプリの設定などを記録したプレファレンスは、/data/data/%Package Name%/shared_prefs にあるらしい。
 関連してSDカードを調べていたら、Environment に/data ディレクトリを取得するmethod があった。
 おそらくSD同様、コレも機種やSDKごとに変わる可能性があるのだろう。
 気になる人は、直指定を避けるべし。

●SDの取得
Environment.getExternalStorageDirectory()
●dataディレクトリの取得
Environment.getDataDirectory()
●Download Cache
Environment.getDownloadCacheDirectory()

※.他にも、getRootDirectory() 等がある。
http://developer.android.com/reference/android/os/Environment.html

/shared_prefs の取得

 前記で取得できるのは、/data まで。
 /data 以下は自分で付加する必要がある。

	File file = new File( Environment.getDataDirectory().getPath()
			+"/data/" 
			+ this.getPackageName()
			+"/shared_prefs/"
			+"pref.xml"
		 );

Posted in path. Tags: , . dataディレクトリの取得・他 (Environment) はコメントを受け付けていません »

SDカードの取得

 SDカードのpathは機種やSDKごとに異なる可能性がある。
 そのため、/sdcard 等の直指定はよろしくない。

 下記コマンドで、Fileオブジェクトを取得できる。

import android.os.Environment;
	Environment.getExternalStorageDirectory()

 pathを取得するには…

String path = 
	Environment.getExternalStorageDirectory().getPath();

 取得したpathの末尾には、/ はつかない。 ( /sdcard )
 ファイル名を付加する場合、ファイル名の前に / を付加する必要がある。

 なお、SDカードへファイルを保存するには、AndroidManifest.xml への記述が必要になる。

<manifest>

	<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<manifest>

Posted in path. Tags: , . SDカードの取得 はコメントを受け付けていません »

Viewを重ねるのがAndroid流…?

 たしかイスラムには、こんな言葉があったと思う。
「コーランの全てを理解しようと思ってはならない。
 それが必要とされる時に、真実は目の前に開かれるものだ」
 つまり “すぐに理解できなくても、繰り返し読めば、ひょんな拍子で理解できる時がくる。”と。
 そんなような言葉がカバラにもあった気がする…。

 FrameLayoutのリファレンスを眺めていて、あるmethodが目に留まった。
 onTouchEvent(MotionEvent event) とか、 scrollBy(int x, int y)とか、draw()とか…。
 View classの特徴そのまま。
 いやいや。なんのことはない。
 親class がViewなのだから、継承したmethod が使えて不思議はない。
 Viewのグループ化、レイアウトだけの機能かと思っていたが、これも勘違い。
 つまりFrameLayout も、れっきとしたView の一種なのである。

 なるほど。
 つまるところ、画像表示のSurfaceViewも、ListViewも、ボタンも、すべてViewの一種である。
 してみると。Android の画面は、部品であるいくつものViewを、多層に重ね合わせることで構成しているのだ。
 例えるなら、セル画やフォトショップのレイヤー。
 一枚のスクリーン(Canvas) に、全てを描いていた身からするとかなりリッチ。ちょっとした驚きである。

 Viewを重ねるのがAndroid流。
 なら、設計方針もそれに習うことにしよう。
// まぁ、元々、そういうつもりではいたんだけどね。(w

Posted in 雑記. Tags: , . Viewを重ねるのがAndroid流…? はコメントを受け付けていません »

ノベル・アプリ設計考察…

 さて。
 いろいろとイジくってきて、なんとなくわかってきた気になったので、そろそろ組み立てていこうかと思う。
 そこでちょいと悩みどころなのが、SurfaceView の必要性。
 テキスト表示にはTextViewが便利なので、使うことは決定。
 で、画像なんかの表示に、もうひとつViewを使おうと思っているのだが…。
 実のところ、TextViewで事足りてしまうのである。

 TextViewは、名前からの先入観で、テキスト専門のViewに思えてしまうが、SurfaceView 同様、ちゃんと画像も表示できる。
 もちろん、画像の上に文字を重ね合わせられるし、驚くことに、定期的にonDraw()が呼び出されて更新もされる。
 それもこの定期更新は、スレッドを使用しなくてもされるのだ。
 1/60同期はとってないようだが、表示画像を移動させてもチラつかない。
 なら、特に描画同期を取る必要もない。
 そう詳しくテストしてないのでアレだが、もしかしたら内部的にダブルバッファを持っているのかも…?
 まぁ、テスト環境が、VirtualBox のせいかもしれないけどね。

 それはともかく。
 性能を考えたら、SurfaceView の必要性はないのである。
 さて。どうしたものか…。

Posted in 雑記. Tags: , . ノベル・アプリ設計考察… はコメントを受け付けていません »

凸Fuck eclipse!!


 ブログラマーの最大の敵といえば、バグにほかならないが、ことAndroidプログラムにおいては異なる。
Androidプログラムにおいて最大の敵とは、eclipseである。

  • 重い
  • 落ちる
  • 起動しない

 まるで後方より味方から狙撃されるがごとく、三拍子揃った最低な開発環境だ。

重い

 まず、起動が重い。
 スプラッシュが長いくらいはかわいいもんだ。
 ウィンドウが表示されてからも、まだ裏でロードしている…。
 それとぶつかるのか、すぐになにかやろうとすると、落ちることまである。

 そして、動作が重い。
 文字色や構文チェックをしているのはわかるが、他のエディタと比べると緩慢すぎる。
 また、ソースが長くなれば、それに比例して重くなる…。
 ヒントも最低だ。
 コードを打っている段階で、さまざまなヒントがでるのだが、それがまた重い。
 たしかにclassヒントなんかは便利だ。
 しかし、表示するまでフリーズしたような状態になるのはいかがなものか?

落ちる

 ワンショット・ライターのごとく、すぐに落ちる。
 それもコッソリ落ちる。
 なにもしていなくても、落ちる!
 なにが原因なのかサッパリ。
 時にはそれが原因で、ビルドできなくなることもある。

 Windows&javaという組み合わせがよくないのだろうか?
 Linuxなら安定して使えるのだろうか?

起動しない

 なにが最低かというと、これほど最低なことはない。
 突然、起動しなくなるのだ。
 役に立たないログ・ファイルを吐き積もらせて逝くばかり。
 起動しないプログラムはハードディスクのゴミだ!

 しかし、Androidプログラムではeclipseを使用しなければならないのが現状。
 なんとか、eclipseを使わずに開発できないものか…。
 Androidシェアをのばしたいなら、まず開発環境をなんとかするのが先決ではなかろうかね?

 これからAndroidプログラムをやってみよう、という方はくれぐれも覚悟した方がよいよ。
 ちなみに。
 ウチではウィルス・チェッカーにAntiVirを使ってるのだが、eclipseはトロイとして認識される。(w

 あ。また落ちてる…

Posted in 雑記. Tags: . 凸Fuck eclipse!! はコメントを受け付けていません »