Days41Sensor

参考自: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);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值