2014年12月22日 星期一

Android Studio 初體驗

  • 第一次下載 Android Studio 1.0 就遇到了一個大問題。就是新建的 Android Project 無法編譯產生 apk 檔。完全找不到原因,也沒有任何錯誤訊息,無解。
  • 今天又重新下載了 Android Studio 1.0.1 安裝,上面的問題竟然解決了,真是太高興了。
  • 但是另一個問題又來了,就是無法啟動 SDK Manager。原來是 Android Studio 1.0.1 內建的 SDK Tools 24.0.0 有問題,只要更新到 24.0.1 就沒問題了。
  • Android Studio 1.0.1 在安裝完後的第一次啟動會自動下載新的 SDK Tools,我竟然把它取消了,造成我一直無法啟動 SDK Manager,最後只好重灌 Android Studio 1.0.1 就解決了。
  • 我有嘗試從 tools.android.com 下載修正檔案,但是卻無法修正成功,不知為什麼。
  • Android Studio 官方下載網址:link

2014年12月3日 星期三

Android Spinner

Android Camera part4 -- preview size

讀取目前的 preview size

Camera.getParameters().getPreviewSize() 會取得目前的 preview size,回傳 Camera.Size。

讀取所有 preview size

Camera.getParameters().getSupportedPreviewSizes() 會讀取所有支援的 preview size,回傳 List<Camera.Size>。

設定 preview size

設定 preview size 比較麻煩,要先讀取 Camera.Parameters,然後對 Camera.Parameters 設定 preview size,再把 Camera.Parameters 寫入 Camera。

  1. Camera.getParameters() 取得 Camera.Parameters。
  2. Camera.Parameters.setPreviewSize(int w, int h) 設定 preview size。
  3. Camera.setParameters() 設定 Camera.Parameters。
import java.io.IOException; import java.util.List; import android.hardware.Camera; import android.hardware.Camera.Size; import android.os.Bundle; import android.app.Activity; import android.view.SurfaceHolder; import android.view.SurfaceView; import android.view.View; import android.widget.AdapterView; import android.widget.ArrayAdapter; import android.widget.LinearLayout; import android.widget.Spinner; public class CameraTestActivity extends Activity implements SurfaceHolder.Callback { private SurfaceView mSurfaceview = null; private SurfaceHolder mSurfaceHolder = null; private Camera mCamera = null; private Spinner mSpinner = null; private List<Size> mSupportedPreviewSizes = null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); LinearLayout ll = new LinearLayout(this); ll.setOrientation(LinearLayout.VERTICAL); setContentView(ll); mSpinner = new Spinner(this); ll.addView(mSpinner); mSpinner.setOnItemSelectedListener(new Spinner.OnItemSelectedListener(){ @Override public void onItemSelected(AdapterView<!----> av, View v, int p, long id){ Camera.Parameters parameter = mCamera.getParameters(); parameter.setPreviewSize( mSupportedPreviewSizes.get(p).width, mSupportedPreviewSizes.get(p).height); mCamera.setParameters(parameter); } @Override public void onNothingSelected(AdapterView<!----> arg0) { } }); mSurfaceview = new SurfaceView(this); mSurfaceHolder = mSurfaceview.getHolder(); mSurfaceHolder.addCallback(this); ll.addView(mSurfaceview); } @Override public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) { } @Override public void surfaceCreated(SurfaceHolder arg0) { try { mCamera = Camera.open(); // set preview size list mSupportedPreviewSizes = mCamera.getParameters().getSupportedPreviewSizes(); String[] availableSizeNames = new String[mSupportedPreviewSizes.size()]; for (int i=0; i<mSupportedPreviewSizes.size(); i++) { availableSizeNames[i] = Integer.toString(mSupportedPreviewSizes.get(i).width) + " x " + Integer.toString(mSupportedPreviewSizes.get(i).height); } ArrayAdapter<String> adapter = new ArrayAdapter<String>( this, android.R.layout.simple_spinner_item, availableSizeNames); adapter.setDropDownViewResource( android.R.layout.simple_spinner_dropdown_item); mSpinner.setAdapter(adapter); // set default preview size Size mCurrentPreviewSizes = mCamera.getParameters().getPreviewSize(); for (int i=0; i<mSupportedPreviewSizes.size(); i++) { if (mSupportedPreviewSizes.get(i).equals(mCurrentPreviewSizes)) { mSpinner.setSelection(i); break; } } // set preview parameter mCamera.setDisplayOrientation(90); mCamera.setPreviewDisplay(mSurfaceHolder); mCamera.startPreview(); } catch (IOException e) { e.printStackTrace(); } } @Override public void surfaceDestroyed(SurfaceHolder arg0) { mCamera.release(); } }

ArrayAdapter

在 ArrayAdapter 的第二個參數需要一個 resource ID 去建立 TextView,如果自己不想建一個,其實 Android 已經有定義好的內建 TextView 樣式,就放在 adt-bundle-windows-x86-20140702\sdk\platforms\android-21\data\res\layout 目錄下。

  • android.R.layout.simple_dropdown_item_1line
  • android.R.layout.simple_dropdown_item_2line
  • android.R.layout.simple_expandable_list_item_1
  • android.R.layout.simple_expandable_list_item_2
  • android.R.layout.simple_list_item_1
  • android.R.layout.simple_list_item_2
  • android.R.layout.simple_list_item_2_single_choice
  • android.R.layout.simple_list_item_activated_1
  • android.R.layout.simple_list_item_activated_2
  • android.R.layout.simple_list_item_checked
  • android.R.layout.simple_list_item_multiple_choice
  • android.R.layout.simple_list_item_single_choice
  • android.R.layout.simple_selectable_list_item
  • android.R.layout.simple_spinner_dropdown_item
  • android.R.layout.simple_spinner_item

參考資料

2014年12月2日 星期二

adt-bundle-windows-x86-20140702 bug

新的SDK新建 Android Project 時,都會自建一個 appcompat_v7 的專案。建就建了,也就算了,問題是不能用啊。搞了半天,google 一堆資料,最後發現,原來是 jar 名稱錯了。

  • 把 appcompat_v7 專案的 bin/android-support-v7-appcompat.jar 改名為 appcompat_v7.jar。
  • 進入新建專案的 Properties,Android -> Project Build Target 選 Android 5.0。
  • 關閉 eclipse,再重新啟動即可。

發現第二種方法,不過要重啟 eclipse 二次,不知為什麼。

  • Project --> Clean... --> 選 appcompat_v7。
  • 關閉 eclipse,再重新啟動即可。
  • Project --> Clean... --> 選目前的專案。
  • 關閉 eclipse,再重新啟動即可。

新的 adt-bundle-windows-x86-20140702 問題真是麻煩,建議可以下載舊版來使用。

parseSdkContent failed

解決方法
  • 停止 Eclipse 即可。
  • 刪除 .android 目錄,比如 C:\Users\使用者帳戶\.android。
  • 刪除 workspace 下面的 .metadata 目錄,比如 C:\Users\使用者帳戶\workspace\.metadata。
  • 重新啟動 Eclipse 即可。

ActionBarActivity

AndroidManifest.xml file missing!

某天在修改 project.properties 檔案,莫明奇妙就出現一個錯誤訊息,"AndroidManifest.xml file missing!"。查了一下,檔案並沒有不見啊,真是見鬼了。

google 一下,原來是 bin 裏面的 AndroidManifest.xml 不見了。解決方法只要把 bin 整個砍掉再重新 build 一次就 OK 了。