1 / 55

Android 硬體

Android 硬體. 建國科技大學資管系 饒瑞佶 2013/3 V1. Camera. CameraAPI 專案. Camera. 使用 Intent 機制 使用 API. Camera by Intent. Main.xml 上需要一個 ImageView. Camera by Intent. Camera by Intent. public class HelloCamera extends Activity { private static int TAKE_PICTURE = 1; //Intent 回應

conan-keith
Télécharger la présentation

Android 硬體

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Android硬體 建國科技大學資管系 饒瑞佶 2013/3 V1

  2. Camera CameraAPI專案

  3. Camera • 使用Intent機制 • 使用API

  4. Camera by Intent • Main.xml上需要一個ImageView

  5. Camera by Intent

  6. Camera by Intent public class HelloCamera extends Activity { private static int TAKE_PICTURE = 1; //Intent回應 private Uri outputFileUri; public ImageView showimg; // 顯示拍攝的照片 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.hello_camera); showimg=(ImageView)findViewById(R.id.imageView1); //顯示照片用 TakePhoto(); // 呼叫Intent }

  7. Camera by Intent // 拍照用Intent private void TakePhoto() { Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); // 儲存到sdcard上,檔名為test.jpg File file = new File(Environment.getExternalStorageDirectory(), "test.jpg"); outputFileUri = Uri.fromFile(file); intent.putExtra(MediaStore.EXTRA_OUTPUT, outputFileUri); startActivityForResult(intent, TAKE_PICTURE); } // Intent完成後 @Override protected void onActivityResult(int requestCode, int resultCode, Intent data){ if (requestCode == TAKE_PICTURE){ //顯示儲存照片路徑與檔名 Toast.makeText(this, "使用Intent拍照完成!", Toast.LENGTH_LONG).show(); //利用ImageView顯示照片 Bitmap bitmap = BitmapFactory.decodeFile("/sdcard/test.jpg"); showimg.setImageBitmap(bitmap); // 利用ImageView顯示拍攝的照片 } } }

  8. Camera by API

  9. Camera by API • UI上設定surfaceview <SurfaceView android:id="@+id/surface_view" android:layout_width="wrap_content" android:layout_height="wrap_content" />

  10. Camera by API • 開放權限 • <uses-permission android:name="android.permission.CAMERA"/> • <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> • 自動對焦 • <uses-feature android:name="android.hardware.camera" /> • <uses-feature android:name="android.hardware.camera.autofocus" /> • 螢幕轉為橫向顯示 • android:screenOrientation="landscape"

  11. Camera by API <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" android:weightSum="1"> <LinearLayout android:layout_height="wrap_content" android:id="@+id/linearLayout1" android:layout_width="fill_parent"> <SurfaceView android:id="@+id/surfaceView1" android:layout_width="250dp" android:layout_height="250dp" /> <Button android:text="拍照" android:id="@+id/button1" android:layout_width="wrap_content" android:layout_height="wrap_content"></Button> <ImageView android:id="@+id/imageView1" android:layout_width="250dp" android:layout_height="250dp" /> </LinearLayout> </LinearLayout> • UI

  12. implements SurfaceHolder.Callback 自動加入

  13. 利用SurfaceView預覽 • UI上加上兩個按鈕 • <Button android:text="啟動預覽" android:id="@+id/button1" android:layout_width="wrap_content" android:layout_height="wrap_content"></Button> • <Button android:text="停止預覽" android:id="@+id/button2" android:layout_width="wrap_content" android:layout_height="wrap_content"></Button>

  14. 利用SurfaceView預覽

  15. 利用SurfaceView預覽-code //啟動預覽按鈕 start = (Button)findViewById(R.id.button1); start.setOnClickListener(new Button.OnClickListener() { public void onClick(View arg0) { start_camera(); } }); //停止預覽 stop = (Button)findViewById(R.id.button2); stop.setOnClickListener(new Button.OnClickListener() { public void onClick(View arg0) { stop_camera(); } }); surfaceView = (SurfaceView)findViewById(R.id.surfaceView1); surfaceHolder = surfaceView.getHolder(); surfaceHolder.addCallback(this); surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

  16. 啟動預覽按鈕

  17. 啟動預覽按鈕-code // 啟動預覽 private void start_camera() { try{ camera = Camera.open(); }catch(RuntimeException e){ return; } Camera.Parameters param; param = camera.getParameters(); //設定參數 param.setPreviewFrameRate(20); param.setPreviewSize(176, 144); camera.setParameters(param); try { camera.setPreviewDisplay(surfaceHolder); camera.startPreview(); } catch (Exception e) { return; } }

  18. 停止預覽按鈕 // 停止預覽 private void stop_camera() { camera.stopPreview(); camera.release(); }

  19. 加入拍照按鈕 • <Button android:text="拍照" android:id="@+id/button3" android:layout_width="wrap_content" android:layout_height="wrap_content"></Button>

  20. 拍照按鈕

  21. 拍照按鈕 - code // 拍照 takephoto = (Button)findViewById(R.id.button3); takephoto.setOnClickListener(new Button.OnClickListener() { public void onClick(View arg0) { camera.takePicture(shutterCallback, rawPictureCallback, jpegPictureCallback); } });

  22. 加入需要的shutterCallback, rawPictureCallback, jpegPictureCallback

  23. ShutterCallback shutterCallback = new ShutterCallback(){ @Override public void onShutter() { // TODO Auto-generated method stub } }; PictureCallback rawPictureCallback = new PictureCallback(){ @Override public void onPictureTaken(byte[] arg0, Camera arg1) { // TODO Auto-generated method stub } };

  24. PictureCallback jpegPictureCallback = new PictureCallback(){ @Override public void onPictureTaken(byte[] arg0, Camera arg1) { // TODO Auto-generated method stub Bitmap bitmapPicture = BitmapFactory.decodeByteArray(arg0, 0, arg0.length); // 存檔到sdcard OutputStream imageFileOS; try { imageFileOS = new FileOutputStream(String.format("/sdcard/DCIM/abcd.jpg")); imageFileOS.write(arg0); imageFileOS.flush(); imageFileOS.close(); Toast.makeText(CameraAPI.this, "拍照完成!",Toast.LENGTH_LONG).show(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } };

  25. Compass eyeeyes專案

  26. UI (I) <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/hello" /> <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="Accelerometer" /> <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="X Value" android:id="@+id/xbox" /> <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="Y Value" android:id="@+id/ybox" />

  27. UI (II) <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="Z Value" android:id="@+id/zbox" /> <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="Orientation" /> <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="X Value" android:id="@+id/xboxo" /> <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="Y Value" android:id="@+id/yboxo" /> <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="Z Value" android:id="@+id/zboxo" /> </LinearLayout>

  28. implements SensorListener

  29. onSensorChanged public void onSensorChanged(int sensor, float[] values) { synchronized (this) { Log.d(tag, "onSensorChanged: " + sensor + ", x: " + values[0] + ", y: " + values[1] + ", z: " + values[2]); if (sensor == SensorManager.SENSOR_ORIENTATION) { xViewO.setText("Orientation X: " + values[0]); yViewO.setText("Orientation Y: " + values[1]); zViewO.setText("Orientation Z: " + values[2]); } if (sensor == SensorManager.SENSOR_ACCELEROMETER) { xViewA.setText("Accel X: " + values[0]); yViewA.setText("Accel Y: " + values[1]); zViewA.setText("Accel Z: " + values[2]); } } }

  30. onResume & onStop

  31. onResume & onStop - code @Override protected void onResume() { super.onResume(); sm.registerListener(this, SensorManager.SENSOR_ORIENTATION | SensorManager.SENSOR_ACCELEROMETER, SensorManager.SENSOR_DELAY_NORMAL); } @Override protected void onStop() { sm.unregisterListener(this); super.onStop(); }

  32. Bluetooth BT_Intent專案

  33. 開啟權限 • <uses-permission android:name="android.permission.BLUETOOTH"/> • <uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/> • <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

  34. BT by Intent Intent intent = new Intent(android.content.Intent.ACTION_SEND); intent.setType("text/plain"); intent.putExtra(Intent.EXTRA_STREAM, Uri.parse("file://mnt/sdcard/test.txt")); startActivity(Intent.createChooser(intent, "xxxxx"));

  35. Result (I) • Emulator • 無法實際動作

  36. Result (II) HTC Desire– Android 2.3 Samsung Nexus S – Android 4.1.1

  37. 提醒 • 手機需要開啟藍芽 • 需要設定成可以被偵測

  38. Proximity Hello_proximity專案

  39. Proximity • 接近感測器 • 偵測 Android 手機靠近臉時做一些動作,例如禁用觸摸功能或關閉螢幕

  40. 建立Proximity物件

  41. 建立Proximity物件 - code SensorManager mySensorManager; // 開啟sensoe管理器 Sensor myProximitySensor; // 建立proximity物件 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.hello_proximity); mySensorManager = (SensorManager)getSystemService(Context.SENSOR_SERVICE); myProximitySensor = mySensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY); if (myProximitySensor == null){ //沒有Proximity感測器 }else{ mySensorManager.registerListener(proximitySensorEventListener, myProximitySensor,SensorManager.SENSOR_DELAY_NORMAL); } }

  42. 建立listener物件

  43. 建立listener物件 - code SensorEventListener proximitySensorEventListener = new SensorEventListener(){ @Override public void onAccuracyChanged(Sensor sensor, int accuracy) { // TODO Auto-generated method stub } @Override public void onSensorChanged(SensorEvent event) { // TODO Auto-generated method stub if(event.sensor.getType()==Sensor.TYPE_PROXIMITY){ //do something } } };

  44. 利用聲音來測試

  45. 利用聲音來測試

  46. WiFi WiFiDemo專案

  47. 開啟權限 • <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission> • <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"></uses-permission>

  48. 註冊receiver <receiver android:name=".WiFiScanReceiver"> <intent-filter> <action android:name="com.example" /> </intent-filter> </receiver>

  49. Layout <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/buttonScan" android:text="Scan"></Button> <ScrollView android:id="@+id/ScrollView01" android:layout_width="wrap_content" android:layout_height="wrap_content"> <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:id="@+id/textStatus" android:text="WiFiDemo" /> </ScrollView> </LinearLayout>

  50. private static final String TAG = "WiFiDemo"; // log記錄用 WifiManager wifi; // WiFi管理者 BroadcastReceiver receiver; // Brodcast TextView textStatus; Button buttonScan;

More Related