1 / 56

Android 硬體

Android 硬體. 建國科技大學資管系 饒瑞佶 2013/3 V1. Compass. 實際硬體. 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

serge
Download Presentation

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. Compass 實際硬體

  3. 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=“Compass" /> <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" />

  4. 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>

  5. implements SensorListener

  6. SensorManagersm=null; TextViewxViewA; // ACCELERATOR TextViewyViewA; TextViewzViewA; TextViewxViewO; // ORIENTATION TextViewyViewO; TextViewzViewO; @Override protectedvoidonCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.compass); sm=(SensorManager)getSystemService(SENSOR_SERVICE); //取得系統服務 xViewA=(TextView)findViewById(R.id.xbox); yViewA=(TextView)findViewById(R.id.ybox); zViewA=(TextView)findViewById(R.id.zbox); xViewO=(TextView)findViewById(R.id.xboxo); yViewO=(TextView)findViewById(R.id.yboxo); zViewO=(TextView)findViewById(R.id.zboxo); }

  7. onSensorChanged public void onSensorChanged(int sensor, float[] values) { synchronized (this) { 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]); } } }

  8. onResume & onStop

  9. 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(); }

  10. Camera CameraAPI專案

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

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

  13. Camera by Intent

  14. 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 }

  15. 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顯示拍攝的照片 } }

  16. Camera by API

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

  18. 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"

  19. 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> • <Button android:text="停止預覽" android:id="@+id/button2" android:layout_width="wrap_content" android:layout_height="wrap_content"></Button> • <Button android:text="拍照" android:id="@+id/button3" 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

  20. implements SurfaceHolder.Callback 自動加入

  21. 利用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>

  22. 利用SurfaceView預覽

  23. Button start; Button stop; Button takephoto; SurfaceView surfaceView; SurfaceHolder surfaceHolder; //啟動預覽按鈕 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);

  24. 啟動預覽按鈕

  25. 啟動預覽按鈕-code android.hardware.Cameracamera=null; // 啟動預覽 privatevoidstart_camera() { try{ camera = android.hardware.Camera.open(); }catch(RuntimeException e){ return; } android.hardware.Camera.Parametersparam; param = camera.getParameters(); param.setPreviewFrameRate(20); param.setPreviewSize(176, 144); camera.setParameters(param); try { camera.setPreviewDisplay(surfaceHolder); camera.startPreview(); } catch (Exception e) { return; } }

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

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

  28. 拍照按鈕

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

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

  31. ShutterCallback shutterCallback = new ShutterCallback(){ @Override public void onShutter() { // TODO Auto-generated method stub } }; PictureCallback rawPictureCallback = new PictureCallback(){ @Override public void onPictureTaken(byte[] data, android.hardware.Camera camera) { // TODO 自動產生的方法 Stub } };

  32. PictureCallback jpegPictureCallback = new PictureCallback(){ @Override public void onPictureTaken(byte[] arg0, android.hardware.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(); } } };

  33. Bluetooth

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

  35. 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"));

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

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

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

  39. Proximity

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

  41. 建立Proximity物件

  42. 建立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); } }

  43. 建立listener物件

  44. 建立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 } } };

  45. 利用聲音來測試 ToneGeneratortg; tg=newToneGenerator(AudioManager.STREAM_NOTIFICATION,100);

  46. 利用聲音來測試 tg.startTone(ToneGenerator.TONE_PROP_BEEP);

  47. WiFi WiFiDemo專案

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

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

  50. 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>

More Related