从Android设备保存传感器数据并将所有数据发送到服务器

时间:2015-03-04 04:00:00

标签: android sqlite http-post android-sensors

我有点麻烦,因为我对Android开发有点新手。我试图读取传感器数据,暂时将数据保存到数据库,然后批量插入我创建的服务器,以便我可以在线显示数据。

我的活动是SensorEventListener,我将每个事件的值写入TextView。我正好阅读事件数据。我认为过于频繁地向服务器发送数据可能是一个问题,所以我决定通过单击菜单按钮启动将数据保存到我的Android应用程序的内部数据库,并从中获取数据。内部数据库并使用不同的菜单按钮将其发送到我的服务器。

我的onSensorChanged(SensorEvent event)方法如下:

@Override
public void onSensorChanged(SensorEvent event) {        
    // Accuracy is handled in the onAccuracy Changed ( - 1 )
    for (int i = 0; i < mTextViews.length - 1; i++) {
        mTextViews[i].setText("Value " + i + ": " + event.values[i]);
    }

    if (mSensorEvents == null) mSensorEvents = new ArrayList<>();
    if (mSensorEvents.size() < VALS_MAX) {
        mSensorEvents.add(event);
    } else {
        mSensorManager.unregisterListener(this);
        new SensorEventLoggerTask().execute(mSensorEvents);
    }
}

正如我之前所说,保存和发送操作是通过菜单按钮启动的,这是我处理的地方:

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    int id = item.getItemId();
    if (id == R.id.action_save_data) {
        mSensorManager.unregisterListener(this);
        new SensorEventLoggerTask().execute(mSensorEvents);
    } else if (id == R.id.action_send_data) {
        new SendSensorDataTask().execute();
    }

    return super.onOptionsItemSelected(item);
}

这些任务看起来像这样:

private class SensorEventLoggerTask extends AsyncTask<List<SensorEvent>, Void, Void> {

    @Override
    protected Void doInBackground(List<SensorEvent>... events) {
        for (int i = 0; i < events.length; i++) {
            SensorEvent event = events[0].get(i);
            String value = Arrays.toString(event.values);
            long timestamp = (new Date()).getTime() + (event.timestamp - System.nanoTime()) / 100000L;
            ContentValues values = new ContentValues();
            values.put(SensorDataHelper.COL_ACCURACY, event.accuracy);
            values.put(SensorDataHelper.COL_NAME, mSensorName);
            // TODO: get the email from the user
            values.put(SensorDataHelper.COL_EMAIL, "jakehockey10@gmail.com");
            values.put(SensorDataHelper.COL_TIMESTAMP, timestamp);
            values.put(SensorDataHelper.COL_VALUE, value);
            getActivity().getContentResolver().insert(SensorDataProvider.CONTENT_URI, values);
        }
        return null;
    }
}

和...

private class SendSensorDataTask extends AsyncTask<String, String, String> {
    private List<HashMap<String, String>> mData = null; // post data

    /**
     * constructor 
     */
    public SendSensorDataTask(){}

    /**
     * background
     */
    @Override
    protected String doInBackground(String... params) {

        Cursor query = getActivity().getContentResolver().query(SensorDataProvider.CONTENT_URI, null, null, null, null);

        return null;
    }
}

我的SensorDataProvider课程中的查询方法只是这样做:

@Override
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, 
                    String sortOrder) {
    Cursor cursor = getDatabase(false).rawQuery("select * from table", null);
    return cursor;
}

正如您所看到的,我还没有发布帖子请求,但那是因为我不太确定该怎么做,尽管我已经找到了一些例子线上。但我无法获取我已经添加到内部数据库中的记录,如果我能解决这个问题,我的下一步就是从这些记录中创建JSON个对象并创建一个{ {1}}请求。

从你看到的,你有什么建议吗?我是以正确的方式接近这个吗?我搞砸了哪里?如果您需要我发布任何更多的片段,请告诉我。我真的很感激一些指导...

0 个答案:

没有答案