




已阅读5页,还剩100页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第16章 首頁畫面小工具與硬體介面 n 16-1 首頁畫面小工具-手機靜音切換 n 16-2 感測器與遊戲控制-跳跳球遊戲 n 16-3 相機-行車記錄器 n 16-4 相機與感測器的應用-聰明相機 n 16-5 藍芽-掃描藍芽裝置 16-1 首頁畫面小工具-手機靜音切換 n 16-1-1 顯示今天日期小工具 n 16-1-2 小工具與IntentService服務-手機靜音切換 16-1 首頁畫面小工具-手機靜音切換 n 首頁畫面小工具(Home Screen Widget)也稱為應用程式 小工具(App Widget)是位在行動裝置的首頁畫面中, 可以與之互動的一種程式,其主要功能是提供使用者重 要的更新資訊,例如:顯示目前行程、今天日期、現在 時間、即時天氣、即時股票行情和背景播放音樂的詳細 資料等。 n 當我們將小工具新增至首頁畫面後,它會佔用一塊固定 區域來顯示應用程式提供的內容,使用者一樣可以透過 小工具與應用程式進行互動,例如:手機靜音切換、切 換WiFi、暫停或切換至下一首音樂等,如果擁有背景服 務,我們還可以定時更新小工具顯示的內容。 16-1-1 顯示今天日期小工具 步驟一:開啟和執行Android專案 n 顯示今天日期小工具是一個在首 頁畫面顯示今天日期的小工具, 它是使用紅色粗體的文字來顯示 今天日期。 n 請啟動Eclipse IDE開啟Android專 案Ch16_1_1,專案的活動類別沒 有任何功能,它只是在TextView 元件顯示一段文字內容,其執行 結果如下圖所示: 16-1-1 顯示今天日期小工具 步驟二:建立小工具的定義檔 n 建立小工具的首要工作是建立定義檔,用來定義小工具 的尺寸和更新頻率,這是位在resxml目錄下的XML 檔appwidgetprovider.xml,在AndroidManifest.xml檔註冊 小工具時也需參考此檔案,如下所示: 16-1-1 顯示今天日期小工具 步驟三:建立小工具介面的版面配置 n 小工具版面配置檔widget.xml是位在reslayout目錄,如下所示 : 16-1-1 顯示今天日期小工具 步驟四:繼承AppWidgetProvider類別覆寫相關方法1 n 首頁畫面小工具事實上就是一個廣播接收器,收到廣播 後更新小工具顯示的內容,在Android SDK提供 AppWidgetProvider提供者類別,我們可以直接繼承 AppWidgetProvider類別覆寫相關方法來建立小工具,如 下所示: public class DateAppWidget extends AppWidgetProvider private SimpleDateFormat formatter = new SimpleDateFormat(“nnnyyyy年nMM月dd日“); . 16-1-1 顯示今天日期小工具 步驟四:繼承AppWidgetProvider類別覆寫相關方法2 onDeleted()方法 n 當刪除1或多個小工具實例後,也就是將首頁畫面的小工 具移至垃圾桶,AppWidget管理員物件會送出 ACTION_APPWIDGET_DELETED 廣播,onDeleted()方法可 以回應此廣播,程式碼只是使用Toast類別顯示呼叫此方 法的訊息文字,如下所示: Override public void onDeleted(Context context, int appWidgetIds) Toast.makeText(context, “onDeleted()“, Toast.LENGTH_LONG).show(); 16-1-1 顯示今天日期小工具 步驟四:繼承AppWidgetProvider類別覆寫相關方法3 onDisabled()方法 n 當刪除屬於此小工具的最後1個物件實例後,就 會送出ACTION_APPWIDGET_DISABLED廣播, onDisabled()方法可以回應此廣播,程式碼只是 使用Toast類別顯示呼叫此方法的訊息文字,如 下所示: Override public void onDisabled(Context context) Toast.makeText(context, “onDisabled()“, Toast.LENGTH_LONG).show(); 16-1-1 顯示今天日期小工具 步驟四:繼承AppWidgetProvider類別覆寫相關方法4 onEnabled()方法 n 當小工具初始化新增至首頁畫面後,就會送出 ACTION_APPWIDGET_ENABLED廣播,onEnabled() 方法可以回應此廣播,程式碼只是使用Toast類 別顯示呼叫此方法的訊息文字,如下所示: Override public void onEnabled(Context context) Toast.makeText(context, “onEnabled()“, Toast.LENGTH_LONG).show(); 16-1-1 顯示今天日期小工具 步驟四:繼承AppWidgetProvider類別覆寫相關方法5 onUpdate()方法 n 當小工具被要求更新RemoteViews物件的介面元件時,就會送出 ACTION_APPWIDGET_UPDATE廣播,它就是在定義檔使用 android:updatePeriodMillis 屬性指定的更新頻率,onUpdate()方法可 以回應此廣播,更新小工具顯示的內容,如下所示: Override public void onUpdate(Context context, AppWidgetManager appWidgetManager, int appWidgetIds) super.onUpdate(context, appWidgetManager, appWidgetIds); String today = formatter.format(new Date(); RemoteViews remoteView = new RemoteViews( context.getPackageName(), R.layout.widget); remoteView.setTextViewText(R.id.widgettext, today); appWidgetManager.updateAppWidget(appWidgetIds, remoteView); Toast.makeText(context, “onUpdate()“, Toast.LENGTH_LONG).show(); 16-1-1 顯示今天日期小工具 步驟五:在AndroidManifest.xml註冊小工具 n 最後我們需要在AndroidManifest.xml檔註冊小工具,也就 是註冊廣播接收器,如下所示: n 在本節的手機靜音切換小工具擁有背景服務,可以送出Intent物件來 更新小工具顯示的圖示,換句話說,按一下小工具可以切換鈴聲狀 態成為靜音且顯示靜音圖示,再按一下就切換成正常且顯示正常圖 示。 n 因為首頁畫面本身是一個在行動裝置上執行,名為啟動器的應用程 式,小工具只是在首頁畫面中特定區域執行的程式,因為Android作 業系統並不允許開發者修改執行中的程式碼,小工具為了能夠更新 內容和與使用者互動,使用的是RemoteViews介面元件架構。 n RemoteViews介面元件架構允許在首頁畫面建立遠端控制的介面元 件,換句話說,在首頁畫面顯示的是獨立行程執行的遠端介面元件 ,實際處理此介面的程式就是繼承AppWidgetProvider提供者類別的 物件。 n 當使用者在小工具的遠端介面進行互動時,例如:按一下,Android 作業系統就像是一個路由器,可以將此廣播轉向送至小工具來處理 ,例如:更新遠端介面元件的內容。 16-1-2 小工具與IntentService服務- 手機靜音切換 16-1-2 小工具與IntentService服務-手機靜音切換 步驟一:開啟和執行Android專案 n 請啟動Eclipse IDE開啟 Android專案Ch16_1_2,專 案的活動類別沒有任何功 能,它只是在TextView元 件顯示一段文字內容,其 執行結果如下圖所示: 16-1-2 小工具與IntentService服務-手機靜音切換 步驟二:建立小工具的定義檔 n 此步驟的定義檔和第16-1-1節的步驟二完全相同 ,筆者就不重複說明。 16-1-2 小工具與IntentService服務-手機靜音切換 步驟三:建立小工具介面的版面配置 n 小工具版面配置檔widget.xml是位在reslayout 目錄,它是使用LinearLayout垂直編排一個 ImageView元件,如下所示: 16-1-2 小工具與IntentService服務-手機靜音切換 步驟四:繼承AppWidgetProvider類別覆寫相關方法1 n 首頁畫面小工具是一個繼承AppWidgetProvider類 別覆寫相關方法的提供者類別,如下所示: public class SilentAppWidget extends AppWidgetProvider . 16-1-2 小工具與IntentService服務-手機靜音切換 步驟四:繼承AppWidgetProvider類別覆寫相關方法2 onRecieve()方法 n 通常覆寫onReceive()方法是用來呼叫AppWidgetProvider類別的其他 方法,在此是處理使用者第1次在首頁畫面新增小工具時,能夠更新 成目前的鈴聲狀態,if條件是呼叫Intent物件的getAction()方法檢查是 否有動作,沒有,就呼叫startService()方法啟動ToggleSilentService服 務來更新鈴聲狀態,如下所示: Override public void onReceive(Context context, Intent intent) if (intent.getAction() = null) context.startService(new Intent(context, ToggleSilentService.class); else super.onReceive(context, intent); 16-1-2 小工具與IntentService服務-手機靜音切換 步驟四:繼承AppWidgetProvider類別覆寫相關方法3 onUpdate()方法 n 在onUpdate()方法呼叫參數Context物件的startService()方 法啟動ToggleSilentService服務,如下所示: Override public void onUpdate(Context context, AppWidgetManager appWidgetManager, int appWidgetIds) context.startService(new Intent(context, ToggleSilentService.class); 16-1-2 小工具與IntentService服務-手機靜音切換 步驟五:建立繼承IntentService類別的服務-1 n IntentService類別是Service類別的子類別,可以用來處理非同步 Intent意圖的請求,每一個Intent物件是新增至佇列後再依序處理, 即啟動執行緒來處理每一個Intent物件,當任務完成後就自動停止服 務,並且可以使用廣播方式來將資料送回應用程式。 n 一般來說,當我們有任務需要在主執行緒外,啟動其他執行緒來執 行此任務,以維持應用程式的執行效能時,或有多個處理請求,需 要使用佇列來一一快速處理時,就可以繼承IntentService類別來建立 服務,如下所示: public class ToggleSilentService extends IntentService public ToggleSilentService() super(“ToggleSilentService“); 16-1-2 小工具與IntentService服務-手機靜音切換 步驟五:建立繼承IntentService類別的服務-2 onHandleIntent()方法 n onHandleIntent()方法是負責處理啟動服務的Intent物件,即處理步驟 四呼叫startService()方法啟動服務的方法參數,執行緒是在請求行程 後就會呼叫此方法,在每一個時間只有一個Intent物件會處理,如下 所示: Override protected void onHandleIntent(Intent arg0) ComponentName cn = new ComponentName( this, SilentAppWidget.class); AppWidgetManager awManager = AppWidgetManager.getInstance(this); awManager.updateAppWidget(cn, updatePhoneStatus(this); 16-1-2 小工具與IntentService服務-手機靜音切換 步驟五:建立繼承IntentService類別的服務-3 updatePhoneStatus()方法 n updatePhoneStatus()方法的傳回值是RemoteViews物件, 它是使用AUDIO_SERVICE系統服務來更新手機的鈴聲狀態 ,方法首先從版面配置資源載入來建立RemoteViews物件 ,如下所示: private RemoteViews updatePhoneStatus(Context context) RemoteViews remoteView = new RemoteViews( context.getPackageName(), R.layout.widget); AudioManager manager = (AudioManager) context.getSystemService(Activity.AUDIO_SERVICE); 16-1-2 小工具與IntentService服務-手機靜音切換 步驟五:建立繼承IntentService類別的服務-4 if (manager.getRingerMode() = AudioManager.RINGER_MODE_SILENT) remoteView.setImageViewResource( R.id.phoneState, R.drawable.phone_on); manager.setRingerMode( AudioManager.RINGER_MODE_NORMAL); else remoteView.setImageViewResource( R.id.phoneState, R.drawable.phone_silent); 16-1-2 小工具與IntentService服務-手機靜音切換 步驟五:建立繼承IntentService類別的服務-5 manager.setRingerMode( AudioManager.RINGER_MODE_SILENT); Intent i = new Intent(this, SilentAppWidget.class); PendingIntent pi = PendingIntent.getBroadcast( context, 0, i, 0); remoteView.setOnClickPendingIntent(R.id.phoneState,pi) ; return remoteView; 16-1-2 小工具與IntentService服務-手機靜音切換 步驟六:在AndroidManifest.xml註冊小工具與服務 n 最後我們需要在AndroidManifest.xml檔註冊小工具與服務,也就是 註冊廣播接收器和ToggleSilentService服務,如下所示: 16-2 感測器與遊戲控制-跳跳球遊戲 n 16-2-1 傾斜監測 n 16-2-2 感測器與遊戲控制-跳跳球遊戲 16-2 感測器與遊戲控制-跳跳球遊戲 n Android支援多種感測器來監測行動裝置目前的 狀態,例如:數位羅盤、加速感測器、重力感測 器、趨近感測器、陀螺儀和環境光線感測器等, 請注意!行動裝置可能只支援其中幾項感測器, 而且Android模擬器不支援感測器,我們只能使 用實機來測試感測器。 n 在實務上,我們最常使用加速感測器( Accelerometer),所以本節是以加速感測器為例 ,說明如何應用在遊戲控制。 16-2-1 傾斜監測 n 傾斜監測是使用加速感測器判斷行動裝置目前是 否傾斜。當我們取得感測器系統服務的 ServiceManager物件後,就可以註冊 SensorEventListener傾聽者物件來取得感測器的 偵測資料,為了避免耗用過多電力,建議在 onResume()方法註冊;onPause()方法取消註冊。 16-2-1 傾斜監測 步驟一:開啟和執行Android專案 n 請啟動Eclipse IDE開啟 Android專案Ch16_2_1,內 含1個Java類別檔和版面配 置檔main.xml,因為 Android模擬器不支援感測 器,筆者是使用2.3版的實 機來測試,其執行結果如 右圖所示: 16-2-1 傾斜監測 步驟二:建立使用介面的版面配置-1 16-2-1 傾斜監測 步驟二:建立使用介面的版面配置-2 16-2-1 傾斜監測 步驟三:建立Activity活動類別使用加速感測器-1 n 在Ch16_2_1Activity活動類別實作SensorEventListener介面 的2個方法,類別開頭宣告成員的SensorManager、 Sensor和TextView物件變數,如下所示: public class Ch16_2_1Activity extends Activity implements SensorEventListener private SensorManager manager; private Sensor accelerometer; private TextView txtOutput, txtTop, txtBottom, txtLeft, txtRight; 16-2-1 傾斜監測 步驟三:建立Activity活動類別使用加速感測器-2 onCreate()方法 n 在覆寫的onCreate()方法載入版面配置後,就可以取得感測器系統服 務的SensorManager物件manager,如下所示: Override public void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState); setContentView(R.layout.main); manager = (SensorManager) getSystemService( SENSOR_SERVICE); accelerometer = manager.getDefaultSensor( Sensor.TYPE_ACCELEROMETER); txtOutput = (TextView) findViewById(R.id.output); txtTop = (TextView) findViewById(R.id.top); txtBottom = (TextView) findViewById(R.id.bottom); txtLeft = (TextView) findViewById(R.id.left); txtRight = (TextView) findViewById(R.id.right); 16-2-1 傾斜監測 步驟三:建立Activity活動類別使用加速感測器-3 onResume()方法 n 在覆寫onResume()方法註冊SensorEventListener 傾聽者物件,即自己,如下所示: Override protected void onResume() super.onResume(); manager.registerListener(this, accelerometer, SensorManager.SENSOR_DELAY_NORMAL); 16-2-1 傾斜監測 步驟三:建立Activity活動類別使用加速感測器-4 onPause()方法 n 在覆寫onPause()方法取消註冊 SensorEventListener傾聽者物件,如下所示: Override protected void onPause() super.onPause(); manager.unregisterListener(this); 16-2-1 傾斜監測 步驟三:建立Activity活動類別使用加速感測器-5 實作SensorEventListener介面的方法 n SensorEventListener傾聽者物件需要實作2個介面方法,不過,我們 只有使用onSensorChanged()方法,這是當感測器資料改變時呼叫的 方法,如下所示: Override public void onAccuracyChanged(Sensor arg0, int arg1) Override public void onSensorChanged(SensorEvent event) float values = event.values; float x, y; int xFactor, yFactor; x = values0 / 10; y = values1 / 10; 16-2-1 傾斜監測 步驟三:建立Activity活動類別使用加速感測器-6 xFactor = (int) Math.min(Math.abs(x) * 255, 255); yFactor = (int) Math.min(Math.abs(y) * 255, 255); if (x 0) txtRight.setBackgroundColor(Color.TRANSPARENT); txtLeft.setBackgroundColor( Color.argb(xFactor, 255, 255, 0); else txtRight.setBackgroundColor(Color.argb(xFactor, 255, 255, 0); txtLeft.setBackgroundColor( Color.TRANSPARENT); if (y 0) 16-2-1 傾斜監測 步驟三:建立Activity活動類別使用加速感測器-7 txtTop.setBackgroundColor(Color.TRANSPARENT); txtBottom.setBackgroundColor( Color.argb(yFactor, 255, 255, 0); else txtTop.setBackgroundColor( Color.argb(yFactor, 255, 255, 0); txtBottom.setBackgroundColor(Color.TRANSPARENT); txtOutput.setText(String.format( “X軸: %1$1.2f, Y軸: %2$1.2f, Z軸: %3$1.2f“, values0, values1, values2); 16-2-2 感測器與遊戲控制-跳跳球遊戲 步驟一:開啟和執行Android專案 n 加速感測器最常應用在遊戲程式 ,這一節我們準備使用加速感測 器來移動螢幕上的黃色球,可以 傾斜行動裝置來控制球的滾動方 向。 n 請啟動Eclipse IDE開啟Android專案 Ch16_2_2,內含2個Java類別檔和 版面配置檔main.xml,因為 Android模擬器不支援感測器,筆 者是使用2.3版的實機來測試,其 執行結果如右圖所示: 16-2-2 感測器與遊戲控制-跳跳球遊戲 步驟二:建立使用介面的版面配置 n 使用介面的版面配置是定義在main.xml版面配置 檔,只有一個FrameLayout版面配置,如下所示 : 16-2-2 感測器與遊戲控制-跳跳球遊戲 步驟三:建立Activity活動類別使用加速感測器-1 n 在Ch16_2_2Activity活動類別實作SensorEventListener介面的2個方法 ,類別開頭宣告成員的SensorManager、Sensor、重繪的Handler、計 時的Timer、TimerTask和PointF物件變數,如下所示: public class Ch16_2_2Activity extends Activity implements SensorEventListener private SensorManager manager; private Sensor accelerometer; private MyBallView ball = null; private Handler redrawHandler = new Handler(); private Timer moveTimer = null; private TimerTask moveTask = null; private int sWidth, sHeight; private PointF ballPos, ballSpeed; 16-2-2 感測器與遊戲控制-跳跳球遊戲 步驟三:建立Activity活動類別使用加速感測器-2 onCreate()方法 n 在覆寫onCreate()方法的開始是使用requestWindowFeature()方法來隱藏標題 列,如下所示: Override public void onCreate(Bundle savedInstanceState) requestWindowFeature(Window.FEATURE_NO_TITLE); getWindow().setFlags(0xFFFFFFFF, LayoutParams.FLAG_FULLSCREEN | LayoutParams.FLAG_KEEP_SCREEN_ON); super.onCreate(savedInstanceState); setContentView(R.layout.main); final FrameLayout board = (FrameLayout) findViewById(R.id.gameboard); 16-2-2 感測器與遊戲控制-跳跳球遊戲 步驟三:建立Activity活動類別使用加速感測器-3 Display display = getWindowManager().getDefaultDisplay(); sWidth = display.getWidth(); sHeight = display.getHeight(); ballPos = new PointF(); ballSpeed = new PointF(); ballPos.x = sWidth / 2; ballPos.y = sHeight / 2; ballSpeed.x = 0; ballSpeed.y = 0; ball = new MyBallView(this, ballPos.x, ballPos.y, 10); board.addView(ball); ball.invalidate(); 16-2-2 感測器與遊戲控制-跳跳球遊戲 步驟三:建立Activity活動類別使用加速感測器-4 manager = (SensorManager) getSystemService( SENSOR_SERVICE); accelerometer = manager.getDefaultSensor( Sensor.TYPE_ACCELEROMETER); board.setOnTouchListener(new View.OnTouchListener() public boolean onTouch(View v, android.view.MotionEvent e) ballPos.x = e.getX(); ballPos.y = e.getY(); return true; ); 16-2-2 感測器與遊戲控制-跳跳球遊戲 步驟三:建立Activity活動類別使用加速感測器-5 onResume()方法 n 在覆寫onResume()方法首先註冊SensorEventListener傾聽 者物件,即自己後,建立Timer計時器物件來移動黃色球 至新位置,如下所示: Override public void onResume() manager.registerListener(this, accelerometer, SensorManager.SENSOR_DELAY_NORMAL); moveTimer = new Timer(); moveTask = new TimerTask() 16-2-2 感測器與遊戲控制-跳跳球遊戲 步驟三:建立Activity活動類別使用加速感測器-6 public void run() Log.d(“Ch16_2_2“,“更新時間 - “ + ballPos.x + “:“ + ballPos.y); ballPos.x += ballSpeed.x; ballPos.y += ballSpeed.y; float oX = 10 * Math.abs(ballSpeed.x); float oY = 10 * Math.abs(ballSpeed.y); if (ballPos.x sWidth) ballPos.x -= oX; if (ballPos.y sHeight) ballPos.y -= oY; if (ballPos.x 16-3-1 照相-我的相機 步驟三:建立Ch16_3_1Activity主活動類別-1 n 在Ch16_3_1Activity活動類別提供按鈕來啟動內建 相機程式來照相和直接進行照相,在類別開頭定 義常數,和宣告成員的ImageView物件變數,如 下所示: public class Ch16_3_1Activity extends Activity private static final int REQUEST_IMAGE = 100; private ImageView imageView; 16-3-1 照相-我的相機 步驟三:建立Ch16_3_1Activity主活動類別-2 onCreate()方法 n 在覆寫的onCreate()方法載入版面配置後,取得 ImageView元件,如下所示: Override public void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState); imageView = (ImageView)findViewById(R.id.image); 16-3-1 照相-我的相機 步驟三:建立Ch16_3_1Activity主活動類別-3 onActivityResult()方法 n 覆寫onActivityResult()方法可以取得相機程式回傳的照片資料,在建 立成Bitmap物件後,在ImageView元件顯示照片,如下所示: Override protected void onActivityResult(int requestCode, int resultCode, Intent data) if (requestCode = REQUEST_IMAGE imageView.setImageBitmap(userImage); 16-3-1 照相-我的相機 步驟三:建立Ch16_3_1Activity主活動類別-4 button12_Click()事件處理方法 n Button元件的事件處理,都是建立Intent物件來啟動活動,在 button1_Click()方法啟動內建相機程式,可以傳回照片結果,如下所 示: public void button1_Click(View view) Intent intent = new Intent( MediaStore.ACTION_IMAGE_CAPTURE); startActivityForResult(intent, REQUEST_IMAGE); public void button2_Click(View view) Intent intent = new Intent(this, CameraView.class); startActivity(intent); 16-3-1 照相-我的相機 步驟四:建立照相活動使用介面的版面配置 n 照相活動使用介面的版面配置是定義在 cameraview.xml版面配置檔,使用LinearLayout編 排1個SurfaceView元件,如下所示: 16-3-1 照相-我的相機 步驟五:建立CameraView照相活動類別-1 n CameraView照相活動類別實作SufaceHolder.Callback介面 和OnClickListener介面,在類別開頭宣告成員的Camera、 SurfaceView和SurfaceHolder物件變數,如下所示: public class CameraView extends Activity implements SurfaceHolder.Callback, OnClickListener private Camera camera; boolean isPreviewRunning = false; private SurfaceView surfaceview; private SurfaceHolder surfaceHolder; 16-3-1 照相-我的相機 步驟五:建立CameraView照相活動類別-2 onCreate()方法 n 在覆寫的onCreate()方法載入版面配置前,指定螢幕為全 螢幕顯示且橫向,如下所示: Override public void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); getWindow().setFlags(WindowManager. LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams. FLAG_FULLSCREEN); 16-3-1 照相-我的相機 步驟五:建立CameraView照相活動類別-3 setRequestedOrientation(ActivityInfo. SCREEN_ORIENTATION_LANDSCAPE); setContentView(R.layout.cameraview); surfaceview = (SurfaceView) findViewById(R.id.cameraview); surfaceview.setOnClickListener(this); surfaceHolder = surfaceview.getHolder(); surfaceHolder.addCallback(this); surfaceHolder.setType(SurfaceHolder. SURFACE_TYPE_PUSH_BUFFERS); 16-3-1 照相-我的相機 步驟五:建立CameraView照相活動類別-4 建立PictureCallback物件 n 程式碼是使用匿名內層類別來建立PictureCallback物件( PictureCallback是介面),這是當拍攝照片後,用來支援取得的影像 資料,類別需要實作onPictureTaken()介面方法,如下所示: Camera.PictureCallback pictureCallback = new Camera.PictureCallback() public void onPictureTaken(byte imageData, Camera c) if (imageData != null) saveImage(CameraView.this, imageData, 50); camera.startPreview(); ; 16-3-1 照相-我的相機 步驟五:建立CameraView照相活動類別-5 實作SurfaceHolder.Callback介面方法 n 活動類別實作SurfaceHolder.Callback介面,可以 接收SurfaceView元件的改變來進行處理,當第1 次建立SurfaceView元件就會馬上呼叫 surfaceCreated()方法,所以,我們在此方法開啟 相機,如下所示: public void surfaceCreated(SurfaceHolder holder) camera = Camera.open(); 16-3-1 照相-我的相機 步驟五:建立CameraView照相活動類別-6 n 我們需要呼叫surfaceChanged()方法來指定尺寸與格式,如下所示: public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) if (isPreviewRunning) camera.stopPreview(); Camera.Parameters p = camera.getParameters(); p.setPreviewSize(w, h); camera.setParameters(p); try camera.setPreviewDisplay(holder); catch (IOException e) e.printStackTrace(); camera.startPreview(); isPreviewRunning = true; 16-3-1 照相-我的相機 步驟五:建立CameraView照相活動類別-7 n 當釋放SurfaceView元件的資源後,就會呼叫 surfaceDestroyed()方法,如下所示: public void surfaceDestroyed(SurfaceHolder holder) camera.stopPreview(); isPreviewRunning = false; camera.release(); 16-3-1 照相-我的相機 步驟五:建立CameraView照相活動類別-8 實作OnClickListener介面方法 n 活動類別實作OnClickListener介面來執行拍攝, 換句話說,就是在螢幕上按一下,就呼叫 onClick()方法執行相機的拍攝,如下所示: public void onClick(View arg0) camera.takePicture(null, pictureCallback, pictureCallback); 16-3-1 照相-我的相機 步驟五:建立CameraView照相活動類別-9 saveImage()方法 n saveImage()方法是我們新增的成員方法,可以將取得的 影像資料儲存JPEG格式的圖檔,首先建立File物件的儲存 路徑,如下所示: public boolean saveImage(Context mContext, byte imageData, int quality) File path = new File(“/sdcard“); try BitmapFactory.Options options = new BitmapFactory.Options(); options.inSampleSize = 5; Bitmap image = BitmapFactory. decodeByteArray(imageData, 0, imageData.length,options); 16-3-1 照相-我的相機 步驟五:建立CameraView照相活動類別-10 FileOutputStream fos = new FileOutputStream( path.toString() +“/image.jpg“); BufferedOutputStream bos = new BufferedOutputStream(fos); press(CompressFormat.JPEG, quality, bos); bos.flush(); bos.close(); catch (Exception e) e.printStackTrace(); return true; 16-3-1 照相-我的相機 步驟六:在AndroidManifest.xml註冊活動和新增權限 n 因為在我的相機程式新增CameraView照相活動,所以在 AndroidManifest.xml檔需要註冊此活動,如下所示: n 因為程式需要使用到相機和將資料儲存在SD卡,所以需 要新增CAMERA和WRITE_EXTERNAL_STORAGE權限,如下 所示: 16-3-2 錄影-行車記錄器 步驟一:開啟和執行Android專案 n 請啟動Eclipse IDE開啟Android專案Ch16_3_2,內 含4個Java類別檔和2個版面配置檔,筆者是使用 2.3版的實機來測試相機的錄影功能,其執行結 果如下圖所示: 16-3-2 錄影-行車記錄器 步驟二:建立主活動使用介面的版面配置 16-3-2 錄影-行車記錄器 步驟三:建立Ch16_3_2Activity主活動類別-1 n
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 关于《伪君子》的教学课件
- 2025年企业战略管理实战案例分析题集
- 2025年特岗教师招聘面试初中语文口语表达技巧与模拟试题
- 2025年初中音乐特岗教师招聘考试趋势与备考策略解析
- 2025年汽车维修工初级面试技巧与答案集
- 2025年建筑工程师招聘面试模拟题集及答案手册
- 2025年初中地理特岗教师招聘模拟考试试卷及答案解析
- 2025年初级瑜伽教练技能考核试题集与实操指南
- 2025年英语能力测试模拟题集听力阅读写作等含答案解析
- 2021年小暑介绍主题教育班会某校图文班会模板
- 安装家具合同协议书范本
- 月饼代销合同协议书
- 购买肉牛合同协议书
- 移动式压力容器安全技术监察规程(TSG R0005-2011)
- 2025小学道德与法治教师课标考试模拟试卷附参考答案 (三套)
- 中国卒中患者高血压管理专家共识(2024)解读
- 汽车制造工艺技术课件:汽车总装生产工艺流程及检测工艺
- 小艇行业跨境出海战略研究报告
- 三会一课培训内容
- GB/T 45309-2025企业采购物资分类编码指南
- 膜性肾病护理进展
评论
0/150
提交评论