550 likes | 717 Vues
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 回應
E N D
Android硬體 建國科技大學資管系 饒瑞佶 2013/3 V1
Camera CameraAPI專案
Camera • 使用Intent機制 • 使用API
Camera by Intent • Main.xml上需要一個ImageView
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 }
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 <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
利用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; } }
停止預覽按鈕 // 停止預覽 private void stop_camera() { camera.stopPreview(); camera.release(); }
加入拍照按鈕 • <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, 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(); } } };
Compass eyeeyes專案
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(); }
Bluetooth BT_Intent專案
開啟權限 • <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"));
Result (I) • Emulator • 無法實際動作
Result (II) HTC Desire– Android 2.3 Samsung Nexus S – Android 4.1.1
提醒 • 手機需要開啟藍芽 • 需要設定成可以被偵測
Proximity Hello_proximity專案
Proximity • 接近感測器 • 偵測 Android 手機靠近臉時做一些動作,例如禁用觸摸功能或關閉螢幕
建立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); } }
建立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 } } };
WiFi WiFiDemo專案
開啟權限 • <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;