android 硬體 建國科技大學資管系 饒瑞佶 2013/3 v1. camera cameraapi 專案
TRANSCRIPT
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 }
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 顯示拍攝的照片 } }}
Camera by API
• UI 上設定 surfaceview
<SurfaceView android:id="@+id/surface_view" android:layout_width="wrap_content" android:layout_height="wrap_content" />
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"
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> <ImageView android:id="@+id/imageView1" android:layout_width="250dp" android:layout_height="250dp" /> </LinearLayout></LinearLayout>
利用 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>
利用 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);
啟動預覽按鈕 -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; } }
加入拍照按鈕• <Button android:text=" 拍照 "
android:id="@+id/button3" android:layout_width="wrap_content" android:layout_height="wrap_content"></Button>
拍照按鈕 - code
// 拍照 takephoto = (Button)findViewById(R.id.button3); takephoto.setOnClickListener(new Button.OnClickListener() { public void onClick(View arg0) { camera.takePicture(shutterCallback, rawPictureCallback, jpegPictureCallback); } });
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 } };
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(); } } };
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" />
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>
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]); } } }
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(); }
開啟權限– <uses-permission
android:name="android.permission.BLUETOOTH"/>
– <uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
– <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
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"));
建立 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);}}
建立 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 } } };
開啟權限– <uses-permission
android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission>
– <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"></uses-permission>
註冊 receiver
<receiver android:name=".WiFiScanReceiver"> <intent-filter> <action android:name="com.example" /> </intent-filter> </receiver>
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>
private static final String TAG = "WiFiDemo"; // log記錄用WifiManager wifi; // WiFi 管理者BroadcastReceiver receiver; // Brodcast
TextView textStatus;Button buttonScan;
@Overridepublic void onStop() {unregisterReceiver(receiver);}
public void onClick(View view) {Toast.makeText(this, "On Click Clicked. Toast to that!!!",Toast.LENGTH_LONG).show();
if (view.getId() == R.id.buttonScan) {Log.d(TAG, "onClick() wifi.startScan()");wifi.startScan();}}
Class WiFiScanReceiver - demopublic class WiFiScanReceiver extends BroadcastReceiver { private static final String TAG = "WiFiScanReceiver"; WiFiDemo wifiDemo;
public WiFiScanReceiver(WiFiDemo 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 networks found. %s is the strongest.", results.size(), bestSignal.SSID); Toast.makeText(wifiDemo, message, Toast.LENGTH_LONG).show();
Log.d(TAG, "onReceive() message: " + message); }
}