壁紙変更アプリ (4)
前回、OnItemClick でファイルリストの選択位置を取得出来たので、
ここから選択したファイルを壁紙に設定してみます。
画像の扱い方を理解していないので、
まずは以下のサイトを参考に画像表示について勉強しました。
http://www.usefullcode.net/2011/01/android_sdkjpg.html
Android は内部で画像データを Bitmap で扱っているみたい。
あー、なるほど。
古い Android タブレットで画像を大量に扱うアプリを使うと、
メモリ確保失敗で死ぬのはこれが原因なのね。
うまく作らないとあっという間にメモリ枯渇するわな。
最近の Android 端末は dalvik heap のサイズ大きいから大丈夫だろうけど。
次に、OnItemClick で取得したファイルリストの選択位置からファイル名を取得。
以下のサイトを参考にしつつ、実装してみる。
http://molehill.mole-kingdom.com/opencms/export/sites/default/translate/Android/TrainingDoc/building-content-sharing/secure-file-sharing/share-file/
って、そもそもファイルリストは既に持ってるから、
選択位置を指定して引っ張るだけだね。
files[position].toString()
取得したファイル名を BitmapFactory の decodeFile() に食わせて、
WallpaperManager の setBitmap で設定して完了。
全体としてはこんな感じ。
public class MainActivity extends ActionBarActivity { WallpaperManager mWM; Bitmap bmpImageFile; private ArrayList<String> item_list; private String strPath; private File[] files; private ListView listview; private String item; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Button button; button = (Button) findViewById(R.id.Button_Choose); //button.setOnClickListener(this); button.setOnClickListener(new OnClickListener() { public void onClick(View v) { Log.v("tag", "test1"); listview = (ListView) findViewById(R.id.listview); item_list = new ArrayList<String>(); // Hard-coded files position. files = new File("/storage/sdcard0/Pictures/Screenshots").listFiles(); // Get files list if (files != null) { for (int i = 0; i < files.length; i++) { item_list.add(files[i].getName()); } } ArrayAdapter<String> arrayadapter = new ArrayAdapter<String> (MainActivity.this, android.R.layout.simple_expandable_list_item_1, item_list); listview.setAdapter(arrayadapter); listview.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { String click_parent = (String) parent.getClass().getSimpleName(); String click_position = String.valueOf(position); String click_id = String.valueOf(id); Log.v("tag", String.format("onItemClick click_parent : %s", click_parent)); Log.v("tag", String.format("onItemClick click_position : %s", click_position)); Log.v("tag", String.format("onItemClick click_id : %s", click_id)); // change the wallpaper Log.v("tag", "test1:"+files[position].toString()); bmpImageFile = BitmapFactory.decodeFile(files[position].toString()); try { mWM.setBitmap(bmpImageFile); } catch (IOException e) { e.printStackTrace(); } } }); } }); button = (Button) findViewById(R.id.Button_Set); button.setOnClickListener(new OnClickListener() { public void onClick(View v) { Log.v("tag", "test2"); } }); button = (Button) findViewById(R.id.Button_Clear); button.setOnClickListener(new OnClickListener() { public void onClick(View v) { Log.v("tag", "test3"); try { mWM.clear(); } catch (IOException e) { e.printStackTrace(); } } }); mWM = WallpaperManager.getInstance(this); } }
匿名クラスでクリック系の処理書いてると、
どんどん全体が見難くなってきたなぁ。。
それはさておき、壁紙設定してみた。
画像はファイルリストをスクリーンショットしたものです。
なにやら期待する感じと違う。。
ホームが複数画面持ってるから、それを考慮する必要があるのかな。
あと、横サイズに合わせて表示されてるため上下が切れてる。。
縦横どちらかに合わせてサイズ設定することと、
ホーム画面スクロールに関係なく固定設定する必要があるね。
次回の課題にします。
そしてもう一つ。
ファイルリスト出て選択出来るようになったのは良いけれど、
ファイルリスト選択後もそのままファイルリスト出っぱなしです。
選択後の画面描画を何も考えていなかった。。
そもそも全体の処理の流れとか、
Activity のライフサイクルとかもそろそろ勉強せねばー。