Hello,

I'm creating an Android application which reads the sensor data and publish
them to the IOT server.

Here I need to display the sensor data in my Activity.
The sensor reading is done separately in a service.

My code files are attached herewith.

When I run the application it gives the following exception.


11-17 19:54:42.842 5484-5484/iot.carbon.wso2.org.androidsenseanget
E/AndroidRuntime: FATAL EXCEPTION: main
11-17 19:54:42.842 5484-5484/iot.carbon.wso2.org.androidsenseanget
E/AndroidRuntime: Process: iot.carbon.wso2.org.androidsenseanget, PID: 5484
11-17 19:54:42.842 5484-5484/iot.carbon.wso2.org.androidsenseanget
E/AndroidRuntime: java.lang.RuntimeException: Error receiving broadcast
Intent {
act=iot.carbon.wso2.org.androidsenseagent.util.SensorsDrawerActivity.displayData
flg=0x10 (has extras) } in
iot.carbon.wso2.org.androidsenseagent.util.SensorsDrawerActivity$2@772125a
11-17 19:54:42.842 5484-5484/iot.carbon.wso2.org.androidsenseanget
E/AndroidRuntime:     at
android.app.LoadedApk$ReceiverDispatcher$Args.run(LoadedApk.java:882)
11-17 19:54:42.842 5484-5484/iot.carbon.wso2.org.androidsenseanget
E/AndroidRuntime:     at android.os.Handler.handleCallback(Handler.java:739)
11-17 19:54:42.842 5484-5484/iot.carbon.wso2.org.androidsenseanget
E/AndroidRuntime:     at android.os.Handler.dispatchMessage(Handler.java:95)
11-17 19:54:42.842 5484-5484/iot.carbon.wso2.org.androidsenseanget
E/AndroidRuntime:     at android.os.Looper.loop(Looper.java:211)
11-17 19:54:42.842 5484-5484/iot.carbon.wso2.org.androidsenseanget
E/AndroidRuntime:     at
android.app.ActivityThread.main(ActivityThread.java:5373)
11-17 19:54:42.842 5484-5484/iot.carbon.wso2.org.androidsenseanget
E/AndroidRuntime:     at java.lang.reflect.Method.invoke(Native Method)
11-17 19:54:42.842 5484-5484/iot.carbon.wso2.org.androidsenseanget
E/AndroidRuntime:     at java.lang.reflect.Method.invoke(Method.java:372)
11-17 19:54:42.842 5484-5484/iot.carbon.wso2.org.androidsenseanget
E/AndroidRuntime:     at
com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1020)
11-17 19:54:42.842 5484-5484/iot.carbon.wso2.org.androidsenseanget
E/AndroidRuntime:     at
com.android.internal.os.ZygoteInit.main(ZygoteInit.java:815)
11-17 19:54:42.842 5484-5484/iot.carbon.wso2.org.androidsenseanget
E/AndroidRuntime:  Caused by: java.lang.NullPointerException: println needs
a message
11-17 19:54:42.842 5484-5484/iot.carbon.wso2.org.androidsenseanget
E/AndroidRuntime:     at android.util.Log.println_native(Native Method)
11-17 19:54:42.842 5484-5484/iot.carbon.wso2.org.androidsenseanget
E/AndroidRuntime:     at android.util.Log.d(Log.java:139)
11-17 19:54:42.842 5484-5484/iot.carbon.wso2.org.androidsenseanget
E/AndroidRuntime:     at
iot.carbon.wso2.org.androidsenseagent.util.SensorsDrawerActivity.updateUI(SensorsDrawerActivity.java:264)
11-17 19:54:42.842 5484-5484/iot.carbon.wso2.org.androidsenseanget
E/AndroidRuntime:     at
iot.carbon.wso2.org.androidsenseagent.util.SensorsDrawerActivity$2.onReceive(SensorsDrawerActivity.java:258)
11-17 19:54:42.842 5484-5484/iot.carbon.wso2.org.androidsenseanget
E/AndroidRuntime:     at
android.app.LoadedApk$ReceiverDispatcher$Args.run(LoadedApk.java:872)
11-17 19:54:42.842 5484-5484/iot.carbon.wso2.org.androidsenseanget
E/AndroidRuntime:     at
android.os.Handler.handleCallback(Handler.java:739)
11-17 19:54:42.842 5484-5484/iot.carbon.wso2.org.androidsenseanget
E/AndroidRuntime:     at
android.os.Handler.dispatchMessage(Handler.java:95)
11-17 19:54:42.842 5484-5484/iot.carbon.wso2.org.androidsenseanget
E/AndroidRuntime:     at android.os.Looper.loop(Looper.java:211)
11-17 19:54:42.842 5484-5484/iot.carbon.wso2.org.androidsenseanget
E/AndroidRuntime:     at
android.app.ActivityThread.main(ActivityThread.java:5373)
11-17 19:54:42.842 5484-5484/iot.carbon.wso2.org.androidsenseanget
E/AndroidRuntime:     at java.lang.reflect.Method.invoke(Native Method)
11-17 19:54:42.842 5484-5484/iot.carbon.wso2.org.androidsenseanget
E/AndroidRuntime:     at java.lang.reflect.Method.invoke(Method.java:372)
11-17 19:54:42.842 5484-5484/iot.carbon.wso2.org.androidsenseanget
E/AndroidRuntime:     at
com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1020)

11-17 19:54:42.842 5484-5484/iot.carbon.wso2.org.androidsenseanget
E/AndroidRuntime:     at
com.android.internal.os.ZygoteInit.main(ZygoteInit.java:815)


Some one could help me to figure out what the problem is.

Thank you
Best Regards
Menaka Madushanka

-- 
Menaka Madushanka Jayawardena
Software Engineering Intern
[email protected]
Mobile:- +94 71 8851183/ +94 71 3505470
LinkedIn - Menaka Jayawardena <https://lk.linkedin.com/in/menakajayawardena>
package iot.carbon.wso2.org.androidsenseagent.service;

import android.app.Service;
import android.content.Intent;
import android.content.IntentFilter;
import android.nfc.Tag;
import android.os.Handler;
import android.os.IBinder;
import android.support.annotation.Nullable;
import android.util.Log;

import iot.carbon.wso2.org.androidsenseagent.input.SenseData;
import iot.carbon.wso2.org.androidsenseagent.input.SensorBroadcastReceiver;

/**
 * Created by menaka on 11/17/15.\
 *
 */
public class UpdateUiService extends Service {

    private static final String TAG = "BroadcastData";
    public static final String BROADCAST_ACTION = "iot.carbon.wso2.org.androidsenseagent.util.SensorsDrawerActivity.displayData";
    private final Handler handler = new Handler();
    public static SenseData data2;
    Intent intent;


    @Override
    public void onCreate() {
        super.onCreate();

        intent = new Intent(BROADCAST_ACTION);

    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        System.out.println("Service statrted");
        handler.removeCallbacks(sendToUI);
        handler.postDelayed(sendToUI, 1000);
        return super.onStartCommand(intent, flags, startId);
    }

    @Override
    public void onDestroy() {
        handler.removeCallbacks(sendToUI);
        super.onDestroy();
    }

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    private Runnable sendToUI = new Runnable() {
        @Override
        public void run() {
            setData();
            handler.postDelayed(this, 1000);
        }
    };

    private void setData(){
        Log.d(TAG, "Setting data");

        IntentFilter filter = new IntentFilter("accelerometer");
        SensorBroadcastReceiver receiver = new SensorBroadcastReceiver();
        registerReceiver(receiver, filter);
        intent.putExtra("data", receiver.getValues());
        sendBroadcast(intent);
        unregisterReceiver(receiver);
    }
}
package iot.carbon.wso2.org.androidsenseagent.input.sensors;

import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.util.Log;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Vector;
import java.util.concurrent.TimeUnit;
import java.util.logging.Handler;

import iot.carbon.wso2.org.androidsenseagent.input.Reader;
import iot.carbon.wso2.org.androidsenseagent.input.SenseData;
import iot.carbon.wso2.org.androidsenseagent.service.UpdateUiService;
import iot.carbon.wso2.org.androidsenseagent.util.DataMap;
import iot.carbon.wso2.org.androidsenseagent.util.DataSendHandler;
import iot.carbon.wso2.org.androidsenseagent.util.SensorsDrawerActivity;

/**
 * Created by menaka on 11/15/15.
 *
 */
public class    SensorDataReader extends Reader implements SensorEventListener {
    private SensorManager mSensorManager;
    private List<Sensor> mSensors;
    private Map<String, SenseData> senseDataStruct = new HashMap<String, SenseData>();
    private Vector<SenseData> sensorVector = new Vector<SenseData>();
    Context ctx;
    private SensorEvent event;


    public SensorDataReader(Context context) {
        ctx = context;
        mSensorManager = (SensorManager) ctx.getSystemService(Context.SENSOR_SERVICE);
        mSensors = mSensorManager.getSensorList(Sensor.TYPE_ALL);

        for (Sensor sensor : mSensors) {
            mSensorManager.registerListener((SensorEventListener) this, sensor, SensorManager.SENSOR_DELAY_FASTEST);
        }
    }

    private void collectSensorData() {
        String s = "";
        Log.d(this.getClass().getName(), "Sensor Type");
        for (Sensor sensor : mSensors) {
            try {
                if (senseDataStruct.containsKey(sensor.getName())) {

                    SenseData sensorInfo = senseDataStruct.get(sensor.getName());
                    sensorVector.add(sensorInfo);
                    Log.d(this.getClass().getName(), "Sensor Name " + sensor.getName() + ", Type " + sensor.getType() + " " +
                            ", sensorValue :" + sensorInfo.getSensorValues());
//                    SensorsDrawerActivity.setSensors(sensorInfo);
                }
            } catch (Throwable e) {
                Log.d(this.getClass().getName(), "error on sensors");
            }

        }

        mSensorManager.unregisterListener(this);


    }

    public Vector<SenseData> getSensorData() {
        try {
            TimeUnit.MILLISECONDS.sleep(1000);
        } catch (InterruptedException e) {
            Log.e(SensorDataReader.class.getName(), e.getMessage());
        }
        collectSensorData();
        return sensorVector;

    }

    @Override
    public void onAccuracyChanged(Sensor sensor, int accuracy) {
    }

    /**
     * Broadcast the sensor value with the sensor type
     * */

    @Override
    public void onSensorChanged(SensorEvent event) {
        this.event = event;
        senseDataStruct.put(event.sensor.getName(), new SenseData(event));

        Intent filter = new Intent(new SupportedSensors().getType(event.sensor.getType()));
        filter.putExtra("value", new SenseData(event).getSensorValues());
        ctx.sendBroadcast(filter);
//        SensorsDrawerActivity.setSensorvalues(new SenseData(event));
    }



    @Override
    public void run() {
        Log.d(this.getClass().getName(), "running -sensor");
        Vector<SenseData> sensorData = getSensorData();
        for (SenseData data : sensorData) {
            DataMap.getSensorDataMap().add(data);
        }

    }


}
package iot.carbon.wso2.org.androidsenseagent.util;

import android.app.DialogFragment;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.hardware.Sensor;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.util.Log;
import android.view.View;
import android.support.design.widget.NavigationView;
import android.support.v4.view.GravityCompat;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.ActionBarDrawerToggle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.TextView;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.concurrent.ConcurrentHashMap;

import iot.carbon.wso2.org.androidsenseagent.R;
import iot.carbon.wso2.org.androidsenseagent.SensorListDialogFragment;
import iot.carbon.wso2.org.androidsenseagent.input.SenseData;
import iot.carbon.wso2.org.androidsenseagent.input.SensorBroadcastReceiver;
import iot.carbon.wso2.org.androidsenseagent.input.sensors.SupportedSensors;
import iot.carbon.wso2.org.androidsenseagent.service.SenseScheduleReceiver;
import iot.carbon.wso2.org.androidsenseagent.service.UpdateUiService;


//The drawer activity.

public class SensorsDrawerActivity extends AppCompatActivity
        implements NavigationView.OnNavigationItemSelectedListener, SensorListDialogFragment.SensorListListener {

    private DialogFragment dialog = new SensorListDialogFragment();
    private SensorManager sensorManager;
    private ListView lv;
    public static  TextView textView;
    private CharSequence[] sensorList2;
    private  List<Sensor> sensors = new ArrayList<>();
    private static ArrayList<SenseData> data = new ArrayList<>();
    static SensorAdaptor arrayAdapter;

    //UpdateUI service
    private Intent intent;

    private ArrayList<String> senselist;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_sensors);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        this.textView = (TextView) findViewById(R.id.data);

        intent = new Intent(this, UpdateUiService.class);

        sensorList2 = getSensorList();

//        this.sensorManager = (SensorManager)getSystemService(Context.SENSOR_SERVICE);
//        sensors = sensorManager.getSensorList(Sensor.TYPE_ALL);
        dialog = setArgs(sensorList2);

        FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);

        //Start pushing data
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
                        .setAction("Action", null).show();
            }
        });

        DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
                this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
        drawer.setDrawerListener(toggle);
        toggle.syncState();

        NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
        navigationView.setNavigationItemSelectedListener(this);
    }

    @Override
    public void onBackPressed() {
        DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        if (drawer.isDrawerOpen(GravityCompat.START)) {
            drawer.closeDrawer(GravityCompat.START);
        } else {
            super.onBackPressed();
        }
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.sensors, 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();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }

    @SuppressWarnings("StatementWithEmptyBody")
    @Override
    public boolean onNavigationItemSelected(MenuItem item) {
        // Handle navigation view item clicks here.
        int id = item.getItemId();

        String s = "Select Sensor";
        if (id == R.id.nav_manage) {
          dialog.show(getFragmentManager(), "Sensor List");
        }

        DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        drawer.closeDrawer(GravityCompat.START);
        return true;
    }


    //get the list of sensors
    public CharSequence[] getSensorList(){

        SupportedSensors supportedSensors = new SupportedSensors();
        List<String> list2 = new ArrayList<>();

//        this.sensors = new ArrayList<>();
        this.sensorManager = (SensorManager)getSystemService(Context.SENSOR_SERVICE);
        sensors = sensorManager.getSensorList(Sensor.TYPE_ALL);

        list2.add("GPS");
        list2.add("Battery");

        for (String sensor : supportedSensors.getList()){ //Iterate through each string in the supported sensor list

            for (Sensor sensor1 : sensors){ //Iterate through each sensor in the available sensor list

                if(sensor1.getType() == supportedSensors.getType(sensor)){

                    list2.add(sensor);


                }

            }

        }

        CharSequence[] sensorList = new CharSequence[list2.size()];

        for(int i = 0; i<list2.size(); i++){

            sensorList[i] = list2.get(i);
        }

        return sensorList;
    }

    public List<Sensor> getslist(){
        return this.sensors;
    }


    //Set arguments to be pushed to the dialog
    public SensorListDialogFragment setArgs(CharSequence[] seq){
        SensorListDialogFragment slf = new SensorListDialogFragment();
        Bundle bn = new Bundle();
        bn.putCharSequenceArray("sens", seq);
        slf.setArguments(bn);
        return slf;
    }



    @Override
    public void onDialogNegativeClick(SensorListDialogFragment dialog) {

    }

    @Override
    public void onDialogPositiveClick(SensorListDialogFragment dialog) {
        System.out.println("OK clicked");
        this.senselist = dialog.getSensorlist();

        //Sensor reading service
        SenseScheduleReceiver senseScheduleReceiver = new SenseScheduleReceiver();
        senseScheduleReceiver.clearAbortBroadcast();
        senseScheduleReceiver.onReceive(getApplicationContext(), null);

        //UI Update service
        startService(intent);
        registerReceiver(receiver, new IntentFilter(UpdateUiService.BROADCAST_ACTION));
    }


        public static void setSensorvalues(SenseData sensorvalues){
            arrayAdapter.notifyDataSetChanged();
            for(SenseData sd : data){
                if(sd.getSensorName().equals(sensorvalues.getSensorName())){
                    data.remove(sd);
                    System.out.println(sd.getSensorValues());
                    data.add(sensorvalues);
                }else{
                    data.add(sensorvalues);
                }
            }
    //        System.out.println("Sensor values: " + sensorvalues.getSensorValues());

        }

    private BroadcastReceiver receiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            updateUI(intent);
        }
    };

    public void updateUI(Intent intent){
        String data = intent.getStringExtra("data");
        Log.d("Hi", data);

        textView.setText(data);
    }

    @Override
    protected void onResume() {
        super.onResume();

    }

    @Override
    protected void onPause() {
        super.onPause();
        unregisterReceiver(receiver);
        stopService(intent);
    }
}
_______________________________________________
Dev mailing list
[email protected]
http://wso2.org/cgi-bin/mailman/listinfo/dev

Reply via email to