エンジニア未満がエンジニア以上を目指す日々(仮)

戦力外通告の悔しさをバネに自身の技術力向上を目指した技術ブログ

壁紙変更アプリ (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);

    }
}

匿名クラスでクリック系の処理書いてると、
どんどん全体が見難くなってきたなぁ。。

それはさておき、壁紙設定してみた。
画像はファイルリストをスクリーンショットしたものです。

f:id:hielf:20140601210222p:plain:w300


なにやら期待する感じと違う。。
ホームが複数画面持ってるから、それを考慮する必要があるのかな。
あと、横サイズに合わせて表示されてるため上下が切れてる。。
縦横どちらかに合わせてサイズ設定することと、
ホーム画面スクロールに関係なく固定設定する必要があるね。
次回の課題にします。

そしてもう一つ。
ファイルリスト出て選択出来るようになったのは良いけれど、
ファイルリスト選択後もそのままファイルリスト出っぱなしです。
選択後の画面描画を何も考えていなかった。。
そもそも全体の処理の流れとか、
Activity のライフサイクルとかもそろそろ勉強せねばー。