Android 传感器应用

一、传感器应用 android4.0以上

就这种错误java.lang.RuntimeException: Unable to start activity ComponentInfo{com.sensorget/com.sensorget.MainActivity}: java.lang.NullPointerException

 

 

哭了,貌似android4.0以上 主线程 不能处理太多任务,系统会强制kill。 所以应采用子线程进行更新ui!!

package com.sensorget;

import java.util.List;

import android.annotation.SuppressLint;
import android.app.Activity;
import android.app.Fragment;
import android.content.Context;
import android.hardware.Sensor;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

@SuppressLint("HandlerLeak")
public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        if (savedInstanceState == null) {
            getFragmentManager().beginTransaction()
                    .add(R.id.container, new PlaceholderFragment()).commit();
        }

        new Thread(runnable).start();// 线程执行!
    }

    Handler handler = new Handler() {
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            Bundle data = msg.getData();
            String val = data.getString("value");

            // 准备显示信息的UI组建
            TextView txt = (TextView) findViewById(R.id.textView1);
            txt.setText(val);
        }
    };

    Runnable runnable = new Runnable() {
        @Override
        public void run() {
            Message msg = new Message();
            Bundle data = new Bundle();

            data.putString("value", initView());
            msg.setData(data);
            handler.sendMessage(msg);
        }
    };

    private String initView() {
        // 从系统服务中获得传感器管理器
        SensorManager sm = (SensorManager) getSystemService(Context.SENSOR_SERVICE);

        // 从传感器管理器中获得全部的传感器列表
        List<Sensor> allSensors = sm.getSensorList(Sensor.TYPE_ALL);
        String str = "";

        // 显示有多少个传感器
        // txt.setText("经检测该手机有" + allSensors.size() + "个传感器,他们分别是:\n");
        str += "经检测该手机有" + allSensors.size() + "个传感器,他们分别是:\n";

        // 显示每个传感器的具体信息
        for (Sensor s : allSensors) {

            String tempString = "\n" + "  设备名称:" + s.getName() + "\n"
                    + "  设备版本:" + s.getVersion() + "\n" + "  供应商:"
                    + s.getVendor() + "\n";
            System.out.println("传感器:" + s.getType());
            switch (s.getType()) {
            case Sensor.TYPE_ACCELEROMETER:
                str += s.getType() + " 加速度传感器accelerometer" + tempString;
                break;
            case Sensor.TYPE_AMBIENT_TEMPERATURE:
                str += s.getType() + " 温度传感器temperature" + tempString;
                break;
            case Sensor.TYPE_GRAVITY:
                str += s.getType() + " 重力传感器gravity" + tempString;
                break;
            case Sensor.TYPE_GYROSCOPE:
                str += s.getType() + " 陀螺仪传感器gyroscope" + tempString;
                break;
            case Sensor.TYPE_LIGHT:
                str += s.getType() + " 环境光线传感器light" + tempString;
                break;
            case Sensor.TYPE_LINEAR_ACCELERATION:
                str += s.getType() + " 线性加速度传感器linear_accelerometer"
                        + tempString;
                break;
            case Sensor.TYPE_MAGNETIC_FIELD:
                str += s.getType() + " 电磁场传感器magnetic field" + tempString;
                break;
            case Sensor.TYPE_PRESSURE:
                str += s.getType() + " 压力传感器pressure" + tempString;
                break;
            case Sensor.TYPE_PROXIMITY:
                str += s.getType() + " 距离传感器proximity" + tempString;
                break;
            case Sensor.TYPE_RELATIVE_HUMIDITY:
                str += s.getType() + " 湿度传感器relative_humidity" + tempString;
                break;
            case Sensor.TYPE_ROTATION_VECTOR:
                str += s.getType() + " 旋转矢量传感器rotation_vector" + tempString;
                break;
            default:
                str += s.getType() + " 未知传感器" + tempString;
                break;
            }
        }
        return str;
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {

        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();
        if (id == R.id.action_settings) {
            return true;
        }
        return super.onOptionsItemSelected(item);
    }

    /**
     * A placeholder fragment containing a simple view.
     */
    public static class PlaceholderFragment extends Fragment {

        public PlaceholderFragment() {
        }

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                Bundle savedInstanceState) {
            View rootView = inflater.inflate(R.layout.fragment_main, container,
                    false);
            return rootView;
        }
    }

}

 

posted @ 2014-11-10 11:08  MicroHao  阅读(319)  评论(0编辑  收藏  举报