56
Android 硬硬硬硬硬硬硬硬硬硬 硬硬硬 2013/3 V1

Android 硬體

  • Upload
    serge

  • View
    244

  • Download
    5

Embed Size (px)

DESCRIPTION

Android 硬體. 建國科技大學資管系 饒瑞佶 2013/3 V1. Compass. 實際硬體. UI (I).

Citation preview

Page 1: Android 硬體

Android 硬體建國科技大學資管系

饒瑞佶2013/3 V1

Page 2: Android 硬體

Compass實際硬體

Page 3: Android 硬體

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" />

Page 4: Android 硬體

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>

Page 5: Android 硬體

implements SensorListener

Page 6: Android 硬體
Page 7: Android 硬體

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]); } } }

Page 8: Android 硬體

onResume & onStop

Page 9: Android 硬體

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

Page 10: Android 硬體

CameraCameraAPI 專案

Page 11: Android 硬體

Camera

• 使用 Intent 機制• 使用 API

Page 12: Android 硬體

Camera by Intent

• xml 上需要一個 ImageView

Page 13: Android 硬體

Camera by Intent

Page 14: Android 硬體

Camera by Intentpublic 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 }

Page 15: Android 硬體

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

Page 16: Android 硬體

Camera by API

Page 17: Android 硬體

Camera by API

• UI 上設定 surfaceview

<SurfaceView android:id="@+id/surface_view" android:layout_width="wrap_content" android:layout_height="wrap_content" />

Page 18: Android 硬體

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"

Page 19: Android 硬體

Camera by API

• UI

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

Page 20: Android 硬體

implements SurfaceHolder.Callback

自動加入

Page 21: Android 硬體

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

Page 22: Android 硬體

利用 SurfaceView 預覽

Page 23: Android 硬體

// 啟動預覽按鈕 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);

Button start;Button stop;Button takephoto;SurfaceView surfaceView;SurfaceHolder surfaceHolder;

Page 24: Android 硬體

啟動預覽按鈕

Page 25: Android 硬體

啟動預覽按鈕 -code

Page 26: Android 硬體

停止預覽按鈕

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

Page 27: Android 硬體

加入拍照按鈕• <Button android:text=" 拍照 "

android:id="@+id/button3" android:layout_width="wrap_content" android:layout_height="wrap_content"></Button>

Page 28: Android 硬體

拍照按鈕

Page 29: Android 硬體

拍照按鈕 - code

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

Page 30: Android 硬體

加入需要的 shutterCallback, rawPictureCallback, jpegPictureCallback

Page 31: Android 硬體

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

} };

Page 32: Android 硬體

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

Page 33: Android 硬體

Bluetooth

Page 34: Android 硬體

開啟權限– <uses-permission

android:name="android.permission.BLUETOOTH"/>

– <uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>

– <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

Page 35: Android 硬體

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

Page 36: Android 硬體

Result (I)

• Emulator• 無法實際動作

Page 37: Android 硬體

Result (II)

Samsung Nexus S – Android 4.1.1 HTC Desire– Android 2.3

Page 38: Android 硬體

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

Page 39: Android 硬體

Proximity

Page 40: Android 硬體

Proximity

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

Page 41: Android 硬體

建立 Proximity 物件

Page 42: Android 硬體

建立 Proximity 物件 - codeSensorManager mySensorManager; // 開啟 sensoe 管理器Sensor myProximitySensor; // 建立 proximity 物件

@Overrideprotected 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);}}

Page 43: Android 硬體

建立 listener 物件

Page 44: Android 硬體

建立 listener 物件 - codeSensorEventListener 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 } } };

Page 45: Android 硬體

利用聲音來測試

Page 46: Android 硬體

利用聲音來測試

Page 47: Android 硬體

WiFiWiFiDemo 專案

Page 48: Android 硬體

開啟權限– <uses-permission

android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission>

– <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"></uses-permission>

Page 49: Android 硬體

註冊 receiver

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

Page 50: Android 硬體

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>

Page 51: Android 硬體

private static final String TAG = "WiFiDemo"; // log 記錄用WifiManager wifi; // WiFi 管理者BroadcastReceiver receiver; // Brodcast

TextView textStatus;Button buttonScan;

Page 52: Android 硬體

掃描 wifi

取得 wifi 狀態

Page 53: Android 硬體

@Overrideprotected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.wifi); // 對應 UI 上的 view textStatus = (TextView) findViewById(R.id.textStatus); buttonScan = (Button) findViewById(R.id.buttonScan); buttonScan.setOnClickListener(WIFI.this);

// 設定 WiFi wifi = (WifiManager) getSystemService(Context.WIFI_SERVICE); // 取得 WiFi 狀態 WifiInfo info = wifi.getConnectionInfo(); textStatus.append("\n\nWiFi 狀態 : " + info.toString()); // 列出可用的無線網路 List<WifiConfiguration> configs = wifi.getConfiguredNetworks(); for (WifiConfiguration config : configs) { textStatus.append("\n\n" + config.toString()); } // 註冊 Broadcast Receiver if (receiver == null) receiver = new WiFiScanReceiver(this);

registerReceiver(receiver, new IntentFilter(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION));}

Page 54: Android 硬體

public void onClick(View view) { Toast.makeText(this, " 掃描完畢 !!!",Toast.LENGTH_LONG).show(); if (view.getId() == R.id.buttonScan) { wifi.startScan(); }}

Page 55: Android 硬體

Class WiFiScanReceiverimport java.util.List;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;import android.net.wifi.ScanResult;import android.net.wifi.WifiManager;import android.widget.Toast;

public class WiFiScanReceiver extends BroadcastReceiver { WIFI wifiDemo;

public WiFiScanReceiver(WIFI wifiDemo) { super(); this.wifiDemo = wifiDemo; }

@Override public void onReceive(Context c, Intent intent) { List<ScanResult> results = wifiDemo.wifi.getScanResults(); ScanResult bestSignal = null; for (ScanResult result : results) { if (bestSignal == null || WifiManager.compareSignalLevel(bestSignal.level, result.level) < 0) bestSignal = result; } String message = String.format(" 找到 %s 個 WiFi 網路, %s 是訊號最強的一個 ", results.size(), bestSignal.SSID); Toast.makeText(wifiDemo, message, Toast.LENGTH_LONG).show(); }}

Page 56: Android 硬體

Result

記得開 WiFi 功能