2012年12月14日金曜日

Hardware Accelerated Execution Manager

MacでAndroidのエミュレーターを爆速で動かす
http://dev.classmethod.jp/smartphone/build-fast-android-emulator/
http://bowz.info/4159
みたいな記事があったのでやってみました。

Mac Book Pro 15inc Retina
Mac OSX 10.8.2

最初は普通にエミュ起動してもっさりー

そいえば以前爆速エミュの記事見た!

てかWindows時代にも一回試してるしやってみよう

エミュ起動時にOS落ちるorz

っとなって結局Hardware Accelerated Execution Managerを消そうと思った時に意外と削除系の記事が無くて困ったので備忘録。
てかMacってpkg系のアンインストール方法ってOSから提供されてないのね(´・ω・`)
んで
http://ho-ki-boshi.blogspot.jp/2010/01/pkg-snow-leopard.html
とか見て消そうと思ったけどなーんか怖い。
その時にふと上記URLの手順上出力されたリスト見てたらアンインストール用のスクリプト入ってたorz
そらIntelさんぐらいになったらそれぐらい入れておくわな…w
って事で備忘録兼ねてメモメモ

sudo /System/Library/Extensions/intelhaxm.kext/Contents/Resources/uninstall.sh

実行後は綺麗にアンインストールされ、エミュレータも起動するようになりました。
結局爆速できなかった(´・ω・`)
まぁ近いうちにやってくれることを期待して待ってます。

2012年9月20日木曜日

AndroidのSpinnerのダイアログ画面をonStopとかで閉じる方法

Androidの標準パーツであるSpinnerはタップしたらダイアログが出せたりしてとっても便利ですがその出てくるダイアログの制御が出来ない。
主に画面を閉じた時に自動的にダイアログも閉じて欲しかったのですが上手くいかないので調べてみたら以外と記事なかったのでメモ書き。

@Override
protected void onStop() {
    super.onStop();
    ViewGroup content = (ViewGroup) findViewById(android.R.id.content);
    Spinner spinner = (Spinner) findViewById(R.id.spinner);
    content.removeView(spinner);
    content.addView(spinner);
}

記事にするほどでも無かったかな…。
Spinnerのソースコード見てみるとダイアログ自体は

private SpinnerPopup mPopup;

として持ってるんだけどこれ自体を触ってる場所はままあるんだけど

dialog.dismiss();

を実行してるのが

protected void onDetachedFromWindow() 

なので一旦ViewGroup内から削除→再追加としてあげるとスルッとうまくいきます。
まぁこんな特殊な使い方するぐらいなら自分で作るなりカスタマイズするなりした方が良いかも。

業務的に使う時の参考にでもしてください。

2012年7月5日木曜日

Eclipse4.2にてコード補完候補が出なくなった時の対処

コード補完(ctrl + space)を押して補完選択の窓は出てくるけど対象リストが出てこず
ウィンドウの左下ぐらいに赤字で「使用可能なコンプリート機能はありません」とか出て
結構困ったので一応メモ

ウィンドウ>設定>Java>エディター>コンテンツ・アシスト>拡張
の画面にある「'default'コンテンツ・アシスト・リストにあるプロポーざるの種類を選択します」
項目の「Javaプロポーザル」のチェックを入れる

これだけで再び一覧出ました。
以前は入ってたのかな…?
3.5系から使い続けてたワークスペースなので変な設定が残ってたのかもしれませぬ。
お困りの方は是非一度ご確認をー

2012年4月10日火曜日

Android標準のギャラリーアプリを利用し画像選択からトリミングし背景に設定するまでのサンプル

ある程度のVerではこれで動作確認しました。
ただ、IS03に標準搭載されてるcom.cooliris.mediaギャラリーのPiscaオンラインアルバムから選択された画像はトリミング出来ませんでした。
なんか毎回オンラインから取得しているみたいでローカルにキャッシュファイル持ってないのかな?
Uri返してくれないので非対応。

動かない機種とかあったらご連絡頂けるととってもアリガタヤー

-ImageCropActivity.java
/*
 * ImageCropActivity
 *
 * Android標準のギャラリーアプリを利用して
 * 画像の選択→選択画像のトリミング
 * を実行。
 */
public class ImageCropActivity extends Activity {

 public final static int ID_IMAGE_GALLERY = 1;
 public final static int ID_IMAGE_CROP  = 2;

 private int    width    = 0;
 private int    height    = 0;

 private String   bgimage    = "bg.png";

 ImageView    layout    = null;
 Button     button    = null;

 @Override
 public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.main);

  layout = (ImageView) findViewById(R.id.MainRootBgr);

  button = (Button) findViewById(R.id.MainCropBtn);
  button.setOnClickListener(new OnClickListener() {
   @Override
   public void onClick(View v) {
    // 画像選択アプリの呼び出し
    Intent intent = new Intent();
    intent.setType("image/*");
    intent.setAction(Intent.ACTION_PICK);
    intent = Intent.createChooser(intent, "Select Gallery App");
    startActivityForResult(intent, ID_IMAGE_GALLERY);
   }
  });
 }

 @Override
 public void onWindowFocusChanged(boolean hasFocus) {
  super.onWindowFocusChanged(hasFocus);

  width = layout.getWidth();
  height = layout.getHeight();
 }

 @Override
 protected void onActivityResult(int requestCode, int resultCode, Intent data) {
  super.onActivityResult(requestCode, resultCode, data);

  if (resultCode == RESULT_OK) {
   switch (requestCode) {
    case ID_IMAGE_GALLERY:
     Uri uri = data.getData();

     Intent intent = new Intent("com.android.camera.action.CROP");
     intent.setType("image/*");
     intent.setData(uri);
     intent.putExtra("outputX", width);
     intent.putExtra("outputY", height);
     intent.putExtra("aspectX", width);
     intent.putExtra("aspectY", height);
     intent.putExtra("scale", true);
     intent.putExtra("setWallpaper", false);
     intent.putExtra("noFaceDetection", false);
     intent.putExtra(MediaStore.EXTRA_OUTPUT, "");
     intent.putExtra("outputFormat", Bitmap.CompressFormat.PNG.name());
     intent = Intent.createChooser(intent, "Select Crop App");

     startActivityForResult(intent, ID_IMAGE_CROP);
     break;
    case ID_IMAGE_CROP:
     try {
      // 一時ファイル場所のUri取得処理
      Uri mUri = data.getData();
      if (mUri == null) {
       String action = data.getAction();
       if (action != null && action.indexOf("content://") > -1) {
        mUri = Uri.parse(action);
       }
      }

      // uriがしっかりと取れているようなら/files/の領域へコピーして一時保存用削除
      if (mUri != null) {
       ContentResolver cr = getContentResolver();
       String[] columns = { MediaColumns.DATA };
       Cursor c = cr.query(mUri, columns, null, null, null);
       if (c != null && c.moveToFirst()) {
        // 一時ファイル
        File ifilepath = new File(c.getString(0));
        // ローカル保存用ファイル
        File ofilepath = new File(getFileStreamPath(bgimage).getPath());

        FileChannel ifile = new FileInputStream(ifilepath).getChannel();
        FileChannel ofile = new FileOutputStream(ofilepath).getChannel();

        // ファイルコピー
        ifile.transferTo(0, ifile.size(), ofile);

        // クローズ処理
        ifile.close();
        ofile.close();

        // 一時ファイルの削除
        getContentResolver().delete(mUri, null, null);

        if (layout != null) {
         layout.setBackgroundDrawable(rntBGImage());
        }

        Toast.makeText(this, "Complete", Toast.LENGTH_SHORT).show();
       } else {
        Toast.makeText(this, "Miss", Toast.LENGTH_SHORT).show();
       }
      }
     } catch (Exception e) {
      Toast.makeText(this, "Error", Toast.LENGTH_SHORT).show();
      e.printStackTrace();
     }
     break;
   }
  }
 }

 private Drawable rntBGImage() {
  Drawable drawable = null;
  try {
   // 初期化
   byte[] buf = new byte[1024];

   // 背景ファイル読み込み
   InputStream in;
   in = openFileInput(bgimage);

   BufferedInputStream ins = new BufferedInputStream(in);
   ByteArrayOutputStream bos = new ByteArrayOutputStream();

   // ループさせて読み込み
   while (true) {
    int ss = ins.read(buf);
    if (ss <= 0)
     break;
    bos.write(buf, 0, ss);
   }
   // Drawableに配列をデコード
   drawable = new BitmapDrawable(BitmapFactory.decodeByteArray(bos.toByteArray(), 0,
    bos.size()));

   in.close();
   bos.close();
  } catch (FileNotFoundException e) {
   e.printStackTrace();
  } catch (IOException e) {
   e.printStackTrace();
  }
  return drawable;
 }
}
-main.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/MainRootLnr"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <ImageView
        android:id="@+id/MainRootBgr"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent" />

    <Button
        android:id="@+id/MainCropBtn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="CropStart" />

</RelativeLayout>