android
Download
Skip this Video
Download Presentation
Android 硬體

Loading in 2 Seconds...

play fullscreen
1 / 56

Android 硬體 - PowerPoint PPT Presentation


  • 430 Views
  • Uploaded on

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

loader
I am the owner, or an agent authorized to act on behalf of the owner, of the copyrighted work described.
capcha
Download Presentation

PowerPoint Slideshow about 'Android 硬體' - serge


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.While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server.


- - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - -
Presentation Transcript
android

Android硬體

建國科技大學資管系

饒瑞佶

2013/3 V1

compass

Compass

實際硬體

slide3
UI (I)

android:orientation="vertical"

android:layout_width="fill_parent"

android:layout_height="fill_parent"

>

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:text=“Compass"

/>

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:text="Accelerometer"

/>

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:text="X Value"

android:id="@+id/xbox"

/>

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:text="Y Value"

android:id="@+id/ybox"

/>

ui ii
UI (II)

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:text="Z Value"

android:id="@+id/zbox"

/>

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:text="Orientation"

/>

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:text="X Value"

android:id="@+id/xboxo"

/>

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:text="Y Value"

android:id="@+id/yboxo"

/>

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:text="Z Value"

android:id="@+id/zboxo"

/>

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

}

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

}

}

}

onresume onstop code
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();

}

camera

Camera

CameraAPI專案

camera1
Camera
  • 使用Intent機制
  • 使用API
camera by intent
Camera by Intent
  • xml上需要一個ImageView
camera by intent2
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 intent3
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 api1
Camera by API
  • UI上設定surfaceview

android:id="@+id/surface_view"

android:layout_width="wrap_content"

android:layout_height="wrap_content" />

camera by api2
Camera by API
  • 開放權限
  • 自動對焦
  • 螢幕轉為橫向顯示
    • android:screenOrientation="landscape"
camera by api3
Camera by API
  • android:orientation="vertical"
  • android:layout_width="fill_parent"
  • android:layout_height="fill_parent"
  • android:weightSum="1">
  • android:id="@+id/surfaceView1"
  • android:layout_width="250dp"
  • android:layout_height="250dp" />
  • android:id="@+id/imageView1"
  • android:layout_width="250dp"
  • android:layout_height="250dp" />
  • UI
surfaceview
利用SurfaceView預覽
  • UI上的兩個按鈕
slide23
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);

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

}

}

slide26
停止預覽按鈕

// 停止預覽

private void stop_camera()

{

camera.stopPreview();

camera.release();

}

slide29
拍照按鈕 - code

// 拍照

takephoto = (Button)findViewById(R.id.button3);

takephoto.setOnClickListener(new Button.OnClickListener()

{

public void onClick(View arg0) {

camera.takePicture(shutterCallback, rawPictureCallback, jpegPictureCallback);

}

});

slide31
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

}

};

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

}

}

};

bt by intent
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
Result (I)
  • Emulator
  • 無法實際動作
result ii
Result (II)

HTC Desire– Android 2.3

Samsung Nexus S – Android 4.1.1

slide38
提醒
  • 手機需要開啟藍芽
  • 需要設定成可以被偵測
proximity1
Proximity
  • 接近感測器
  • 偵測 Android 手機靠近臉時做一些動作,例如禁用觸摸功能或關閉螢幕
proximity code
建立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
建立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

}

}

};

slide45
利用聲音來測試

ToneGeneratortg;

tg=newToneGenerator(AudioManager.STREAM_NOTIFICATION,100);

slide46
利用聲音來測試

tg.startTone(ToneGenerator.TONE_PROP_BEEP);

slide47

WiFi

WiFiDemo專案

layout
Layout

android:orientation="vertical" android:layout_width="fill_parent"

android:layout_height="fill_parent">

android:layout_width="wrap_content" android:layout_height="wrap_content">

android:layout_height="wrap_content" android:id="@+id/textStatus"

android:text="WiFiDemo" />

slide51
private static final String TAG = "WiFiDemo"; // log記錄用

WifiManager wifi; // WiFi管理者

BroadcastReceiver receiver; // Brodcast

TextView textStatus;

Button buttonScan;

slide53
@Override

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

}

slide54
publicvoid onClick(View view) {

Toast.makeText(this, "掃描完畢!!!",Toast.LENGTH_LONG).show();

if (view.getId() == R.id.buttonScan) {

wifi.startScan();

}

}

class wifiscanreceiver
Class WiFiScanReceiver

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

publicclass WiFiScanReceiver extends BroadcastReceiver {

WIFI wifiDemo;

public WiFiScanReceiver(WIFI wifiDemo) {

super();

this.wifiDemo = wifiDemo;

}

@Override

publicvoid onReceive(Context c, Intent intent) {

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

}

}

result
Result

記得開WiFi功能

ad