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