参考自:http://www.runoob.com/w3cnote/android-tutorial-sensor1.html
(一)获得设备上所有的传感器及传感器的相关信息
1、获得传感器管理器:
SensorManager manager =(SensorManager)getSystemService(Context.SENSOR_SERVICE);
2、返回一个List包含全部的传感器列表
List<Sensor> sensorList = manager.getSensorList(Sensor.TYPE_ALL);
3、迭代获取Sensor对象,然后调用对应方法获得传感器的相关信息:
sensor.getName(); //获得传感器名称
sensor.getType(); //获得传感器种类
sensor.getVendor(); //获得传感器供应商
sensor.getVersion(); //获得传感器版本
sensor.getResolution(); //获得精度值
sensor.getMaximumRange(); //获得最大范围
sensor.getPower(); //传感器使用时的耗电量
(二)调用系统相机,拍照后可以使用或保存照片
Intent的一些用法和总结:http://blog.youkuaiyun.com/wsscy2004/article/details/7505781
// 应该掌握检查权限和请求权限的套路
/**
* 隐式启动相机,在onActivityResult方法中,当请求码和结果码均匹配,则代表相机处理结束
* 通过回传的Intent,获得Bundle,根据bundle.get("data"),获得相机拍好的照片(bitmap),再进行相关使用
* @param view
*/
public void getSystemCamera(View view) {
// 检查是否有使用照相设备的权限
// PackageManager是一个管理应用程序安装、卸载和升级的API
if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED) {
Intent intent = new Intent();
// MediaStore包括了多媒体数据库的所有信息,包括音频、视频和图像
intent.setAction(MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(intent, REQUEST_CODE);
} else {
// 请求权限
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA}, 1605);
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == REQUEST_CODE && resultCode == RESULT_OK) {
if (data != null) {
Bundle bundle = data.getExtras();
Bitmap bitmap = (Bitmap) bundle.get("data");
if (bitmap != null) {
ivPic.setImageBitmap(bitmap);
}
}
}
if (requestCode == REQUEST_CODE2 && resultCode == RESULT_OK) {
Bitmap bitmap = BitmapFactory.decodeFile(path);
if(bitmap != null){
ivPic.setImageBitmap(bitmap);
}
}
super.onActivityResult(requestCode, resultCode, data);
}
/**
* 先检查是否有使用相机的权限,给intent放入数据(使用相机后照片输出到手机的标志,输出到手机的目录),最后Intent隐式启动相机
* 当获得照片后,再根据请求码和结果码是否匹配,若匹配则代表照片保存成功,可以根据保存的路径找到该图片,并进行相应操作
* @param v
*/
public void getSystemCameraAndSetting(View v) {
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED) {
Intent intent = new Intent();
intent.setAction(MediaStore.ACTION_IMAGE_CAPTURE);
File f = new File(path);
intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(f));
startActivityForResult(intent, REQUEST_CODE2);
} else {
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA}, 1605);
}
}
(三)模仿微信摇一摇
当用户摇动了手机,开始动画并播放音频并震动
思路:将动画资源、振动设置和音频播放均准备好,当加速度大于预定值就判定用户摇动了手机,开启动画、振动和音频,注意:要控制摇一摇的触发频率,使它短时间内不能连续被触发两次。
扩展:
参考自:http://www.2cto.com/kf/201408/325318.html
SoundPool主要用于播放一些较短的声音片段,与MediaPlayer相比,SoundPool的优势在于CPU资源占用量低和反应延迟小。另外,SoundPool还支持自行设置声音的品质、音量、 播放比率等参数。
参考自:http://blog.youkuaiyun.com/x605940745/article/details/16941139
android振动器(Vibrator)
public class ShakeActivity extends AppCompatActivity {
private ImageView ivUp, ivDown;
private SensorManager manager = null;
private Sensor sensor = null;
private SensorEventListener eventListener;
private AnimationSet upAnimation, downAnimation;
private boolean flag = true;
private long currentTime;
private Vibrator vibrator;
private SoundPool soundPool;
private int load;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_shake);
initView();
setData();
setListener();
}
// 别忘了注册传感器的监听
/**
* 上下文对象,Sensor传感器对象, 以及传感器的延时时间的精度密度,有四个可选值:
* SENSOR_DELAY_FASTEST——延时:0ms
* SENSOR_DELAY_GAME——延时:20ms
* SENSOR_DELAY_UI——延时:60ms
* SENSOR_DELAY_NORMAL——延时:200ms
* 当然低延时意味着更频繁的检车,更意味着更多的电量消耗,如果不是要求精度非常高的建议 别使用太高精度的,一般用第三个较多~
*/
@Override
protected void onResume() {
super.onResume();
manager.registerListener(eventListener, sensor, SensorManager.SENSOR_DELAY_NORMAL);
}
// 也别忘了取消注册传感器的监听
@Override
protected void onPause() {
super.onPause();
manager.unregisterListener(eventListener);
}
private void setListener() {
eventListener = new SensorEventListener() {
// 当传感器的值变化时回调
/**
*一般获取传感器数据的来源就是这个SensorEvent,这个类中有一个values的变量, 类型是Float[],
* 该变量最多有只有三个元素,而且传感器不同,对应元素代表的含义也不同,
* 比如方向传感器中第一个元素是方位角的值,而气压传感器中第一个值则是气压值!
* @param sensorEvent
*/
@Override
public void onSensorChanged(SensorEvent sensorEvent) {
// 摇动间隔小于五秒不能开启传感器的事件
if(System.currentTimeMillis() - currentTime > 5000){
flag = true;
}
// 设置短时间内不能重复摇动
if (flag) {
float[] values = sensorEvent.values;
// 加速度可能会是负值,所以要取他们的绝对值
float valueX = Math.abs(values[0]);
float valueY = Math.abs(values[1]);
float valueZ = Math.abs(values[2]);
// 检测手机在X轴、Y轴和Z轴上的加速度,当达到了预定值就可以认为用户摇动了手机,考虑到重力加速度,要大于9.8
if (valueX > 30 || valueY > 30 || valueZ > 30) {
// 认为用户摇动了手机,开始动画并播放音频并震动
flag = false;
currentTime = System.currentTimeMillis();
// 开始震动
vibrator.vibrate(new long[]{200, 200, 200, 200, 200}, -1);
// 加声音
/**
* soundID指定播放哪个声音
* leftVolume,rightVolume指定左右的音量
* priority指定播放声音的优先级,数值越大优先级越高
* loop指定是否循环,0不循环,-1循环
* rate指定播放的比率
*/
soundPool.play(load, 1, 1, 1, 0, 1);
ivUp.startAnimation(upAnimation);
ivDown.startAnimation(downAnimation);
}
}
}
// 当传感器的进度发生改变时回调
@Override
public void onAccuracyChanged(Sensor sensor, int i) {
}
};
}
private void setData() {
manager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
sensor = manager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
// 注意:使用震动需要权限
vibrator = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
// 第一个参数指定支持多少个声音;第二个参数指定声音类型;第三个参数指定声音品质
soundPool = new SoundPool(3, AudioManager.STREAM_MUSIC, 0);
// 从resId所对应的资源加载声音
load = soundPool.load(this, R.raw.kakaka, 10);
// AnimationSet的构造方法,会传入一个布尔值,
// 当为true时,表示其所加入的动画的插值器使用AnimationSet所设置的插值器
// 当为false时,标识其所加入的动画使用它们自己所设置的插值器
upAnimation = new AnimationSet(true);
upAnimation.setDuration(500);
upAnimation.setStartOffset(100);
TranslateAnimation upUp = new TranslateAnimation(Animation.RELATIVE_TO_SELF, 0, Animation.RELATIVE_TO_SELF, 0, Animation.RELATIVE_TO_SELF, 0, Animation.RELATIVE_TO_SELF, -1);
upUp.setDuration(200);
TranslateAnimation upDown = new TranslateAnimation(Animation.RELATIVE_TO_SELF, 0, Animation.RELATIVE_TO_SELF, 0, Animation.RELATIVE_TO_SELF, -1, Animation.RELATIVE_TO_SELF, 0);
upDown.setDuration(200);
upAnimation.addAnimation(upUp);
upAnimation.addAnimation(upDown);
downAnimation = new AnimationSet(true);
downAnimation.setDuration(500);
downAnimation.setStartOffset(100);
TranslateAnimation downDown = new TranslateAnimation(Animation.RELATIVE_TO_SELF, 0, Animation.RELATIVE_TO_SELF, 0, Animation.RELATIVE_TO_SELF, 0, Animation.RELATIVE_TO_SELF, 1);
downDown.setDuration(200);
TranslateAnimation downUp = new TranslateAnimation(Animation.RELATIVE_TO_SELF, 0, Animation.RELATIVE_TO_SELF, 0, Animation.RELATIVE_TO_SELF, 1, Animation.RELATIVE_TO_SELF, 0);
downUp.setDuration(200);
downAnimation.addAnimation(downDown);
downAnimation.addAnimation(downUp);
}
private void initView() {
ivUp = (ImageView) findViewById(R.id.iv_shake_up);
ivDown = (ImageView) findViewById(R.id.iv_shake_down);
}
}
(四)二维码的识别与生成
Zxing是Google提供的关于条码(一维码、二维码)的解析工具,提供了二维码的生成与解析的方法
EncodingHandler.enCodeStringWithLogo()方法生成包含二维码的Bitmap,参数为:字符串内容,context,二维码中心的logo图片(bitmap类型),长宽值
使用对应的jar包qrcode
public class ZXingActivity extends AppCompatActivity {
private TextView txtZXing = null;
private ImageView ivQRCode = null;
private static final int REQUEST_CODE = 1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_zxing);
txtZXing = (TextView) findViewById(R.id.txtZXing);
ivQRCode = (ImageView) findViewById(R.id.ivQRCode);
}
public void scanBarCode(View view) {
//capture捕捉
Intent intent = new Intent(this,CaptureActivity.class);
startActivityForResult(intent,REQUEST_CODE);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == REQUEST_CODE && resultCode == RESULT_OK) {
//在CautureActivity中有putString("result",result);
String result = data.getStringExtra("result");
txtZXing.setText(result);
}
super.onActivityResult(requestCode, resultCode, data);
}
public void getQRCode(View view) {
String content = "行百里者半九十";
Bitmap bitmap = EncodingHandler.enCodeStringWithLogo(content, this, null, 200);
ivQRCode.setImageBitmap(bitmap);
}
public void getQRCodeWithLogo(View view) {
String content = "孤独与寂寞";
Bitmap bitmap = EncodingHandler.enCodeStringWithLogo(content, this, BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher), 200);
ivQRCode.setImageBitmap(bitmap);
}
}