找回密码
 马上注册

QQ登录

只需一步,快速开始

楼主: grant7788

记手机上Android系统编程的过程(手机可以读到NXT电量了)

   火.. [复制链接]
发表于 2011-3-1 21:52:38 | 显示全部楼层
grant7788 发表于 2011-2-21 22:18
回复 Programus 的帖子

BTW, G7到手了,充电中。我还没配Micro-SD卡,准备先把手机通讯录等等同步了,搞到 ...

好快啊!我想要的那个,经历了断货之后,开始涨价。只有继续观望一阵了……
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

发表于 2011-3-1 22:08:51 | 显示全部楼层
本帖最后由 Programus 于 2011-3-1 22:10 编辑
sdragon_163 发表于 2011-2-28 21:46
哥们儿,赶紧讲讲Android通过蓝牙编程怎么与NXT通信呢?还有,调用各种手机传感器的简单例程,多谢多谢:)

蓝牙没研究过,不过传感器编程研究过一些,这里有两个简单例子。

SensorDetector.zip (39.82 KB, 下载次数: 16)
上面这个是检测当前Android设备上所有传感器信息,并适时显示传感器数值的程序。
(对重力、方向、磁力等传感器有效,其他传感器数据意义不明)

G-Ball.zip (52.27 KB, 下载次数: 11)
这个是一个很简单的小球程序。偏转手机,模拟小球的重力效应。


以上程序都不是最终成品,所以没有多少注释,也没有严格测试过,在某些极特殊情况下可能有些小bug。但肯定无损机器。呵呵……
总得来说,传感器编程,就是自己实现一个SensorEventListener,然后实现public void onSensorChanged(SensorEvent event)方法来处理传感器数值。

如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

 楼主| 发表于 2011-3-1 22:34:56 | 显示全部楼层
Programus 发表于 2011-3-1 21:52
好快啊!我想要的那个,经历了断货之后,开始涨价。只有继续观望一阵了……

我下手时上海已经开始涨了,打听了一下说是因为3.15,要打水货。后来通过朋友从珠海调的货。
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

 楼主| 发表于 2011-3-1 22:35:54 | 显示全部楼层
sdragon_163 发表于 2011-3-1 17:27
回复 grant7788 的帖子

期待中,呵呵老大慢慢来。我个人觉得,只要搞定下面两个事,基本借助手机传感器扩展 ...

你说得对。最近工作上有些事情比较耗精力,容我点儿空,呵呵~
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

发表于 2011-3-1 22:36:14 | 显示全部楼层
sdragon_163 发表于 2011-3-1 17:27
回复 grant7788 的帖子

期待中,呵呵老大慢慢来。我个人觉得,只要搞定下面两个事,基本借助手机传感器扩展 ...

基本同意。
不过Android编程,实际接触起来,比想象的复杂一点。如果要有个像样的东西,对基本的UI设计以及多线程相关内容可能也得涉猎一下。
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

发表于 2011-3-1 22:37:26 | 显示全部楼层
本帖最后由 Programus 于 2011-3-1 22:38 编辑
grant7788 发表于 2011-3-1 22:35
你说得对。最近工作上有些事情比较耗精力,容我点儿空,呵呵~

深刻同情中……
工作是业余爱好的头号大敌啊!
(或者应该反过来说?)
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

 楼主| 发表于 2011-3-1 22:38:48 | 显示全部楼层
Programus 发表于 2011-3-1 22:08
蓝牙没研究过,不过传感器编程研究过一些,这里有两个简单例子。

非常感谢。前两天想偷懒用Python for Android直接写来的,结果发现了一个Bluetooth下的疑似bug,传感器的部分Python下倒是没啥问题。
我准备有时间的话先开始试bluetooth了。
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

 楼主| 发表于 2011-3-1 22:41:32 | 显示全部楼层
Programus 发表于 2011-3-1 22:36
基本同意。
不过Android编程,实际接触起来,比想象的复杂一点。如果要有个像样的东西,对基本的UI设计以 ...

说得对。所以,开始阶段,我写的程序肯定是界面丑陋的...
话说回来,貌似我一直以来写的程序都是界面丑陋的... 汗自己一个。

如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

 楼主| 发表于 2011-3-1 22:42:05 | 显示全部楼层
Programus 发表于 2011-3-1 22:37
深刻同情中……
工作是业余爱好的头号大敌啊!
(或者应该反过来说?)

嘿嘿... 相辅相承,相辅相承...

如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

 楼主| 发表于 2011-3-1 23:14:01 | 显示全部楼层
现代级 发表于 2011-3-1 18:18
应该按照上面的步骤来执行就可以了吧,我回去也好好试试。

你可以试一下,如果遇到问题的话大家讨论。我还没做完。
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

 楼主| 发表于 2011-3-2 09:53:44 | 显示全部楼层
  1. /*
  2. * Copyright (C) 2007 The Android Open Source Project
  3. *
  4. * Licensed under the Apache License, Version 2.0 (the "License");
  5. * you may not use this file except in compliance with the License.
  6. * You may obtain a copy of the License at
  7. *
  8. *      http://www.apache.org/licenses/LICENSE-2.0
  9. *
  10. * Unless required by applicable law or agreed to in writing, software
  11. * distributed under the License is distributed on an "AS IS" BASIS,
  12. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13. * See the License for the specific language governing permissions and
  14. * limitations under the License.
  15. */

  16. package com.Sensors;

  17. import android.app.Activity;
  18. import android.content.Context;
  19. import android.os.Bundle;
  20. import android.view.View;
  21. import android.hardware.Sensor;
  22. import android.hardware.SensorEvent;
  23. import android.hardware.SensorEventListener;
  24. import android.hardware.SensorManager;
  25. import android.graphics.Bitmap;
  26. import android.graphics.Canvas;
  27. import android.graphics.Color;
  28. import android.graphics.Paint;
  29. import android.graphics.Path;
  30. import android.graphics.RectF;

  31. /**
  32. * <h3>Application that displays the values of the acceleration sensor graphically.</h3>

  33. <p>This demonstrates the {@link android.hardware.SensorManager android.hardware.SensorManager} class.

  34. <h4>Demo</h4>
  35. OS / Sensors

  36. <h4>Source files</h4>
  37. * <table class="LinkTable">
  38. *         <tr>
  39. *             <td >src/com.example.android.apis/os/Sensors.java</td>
  40. *             <td >Sensors</td>
  41. *         </tr>
  42. * </table>
  43. */
  44. public class Sensors extends Activity {
  45.     private SensorManager mSensorManager;
  46.     private GraphView mGraphView;

  47.     private class GraphView extends View implements SensorEventListener
  48.     {
  49.         private Bitmap  mBitmap;
  50.         private Paint   mPaint = new Paint();
  51.         private Canvas  mCanvas = new Canvas();
  52.         private Path    mPath = new Path();
  53.         private RectF   mRect = new RectF();
  54.         private float   mLastValues[] = new float[3*2];
  55.         private float   mOrientationValues[] = new float[3];
  56.         private int     mColors[] = new int[3*2];
  57.         private float   mLastX;
  58.         private float   mScale[] = new float[2];
  59.         private float   mYOffset;
  60.         private float   mMaxX;
  61.         private float   mSpeed = 1.0f;
  62.         private float   mWidth;
  63.         private float   mHeight;

  64.         public GraphView(Context context) {
  65.             super(context);
  66.             mColors[0] = Color.argb(192, 255, 64, 64);
  67.             mColors[1] = Color.argb(192, 64, 128, 64);
  68.             mColors[2] = Color.argb(192, 64, 64, 255);
  69.             mColors[3] = Color.argb(192, 64, 255, 255);
  70.             mColors[4] = Color.argb(192, 128, 64, 128);
  71.             mColors[5] = Color.argb(192, 255, 255, 64);

  72.             mPaint.setFlags(Paint.ANTI_ALIAS_FLAG);
  73.             mRect.set(-0.5f, -0.5f, 0.5f, 0.5f);
  74.             mPath.arcTo(mRect, 0, 180);
  75.         }

  76.         @Override
  77.         protected void onSizeChanged(int w, int h, int oldw, int oldh) {
  78.             mBitmap = Bitmap.createBitmap(w, h, Bitmap.Config.RGB_565);
  79.             mCanvas.setBitmap(mBitmap);
  80.             mCanvas.drawColor(0xFFFFFFFF);
  81.             mYOffset = h * 0.5f;
  82.             mScale[0] = - (h * 0.5f * (1.0f / (SensorManager.STANDARD_GRAVITY * 2)));
  83.             mScale[1] = - (h * 0.5f * (1.0f / (SensorManager.MAGNETIC_FIELD_EARTH_MAX)));
  84.             mWidth = w;
  85.             mHeight = h;
  86.             if (mWidth < mHeight) {
  87.                 mMaxX = w;
  88.             } else {
  89.                 mMaxX = w-50;
  90.             }
  91.             mLastX = mMaxX;
  92.             super.onSizeChanged(w, h, oldw, oldh);
  93.         }

  94.         @Override
  95.         protected void onDraw(Canvas canvas) {
  96.             synchronized (this) {
  97.                 if (mBitmap != null) {
  98.                     final Paint paint = mPaint;
  99.                     final Path path = mPath;
  100.                     final int outer = 0xFFC0C0C0;
  101.                     final int inner = 0xFFff7010;

  102.                     if (mLastX >= mMaxX) {
  103.                         mLastX = 0;
  104.                         final Canvas cavas = mCanvas;
  105.                         final float yoffset = mYOffset;
  106.                         final float maxx = mMaxX;
  107.                         final float oneG = SensorManager.STANDARD_GRAVITY * mScale[0];
  108.                         paint.setColor(0xFFAAAAAA);
  109.                         cavas.drawColor(0xFFFFFFFF);
  110.                         cavas.drawLine(0, yoffset,      maxx, yoffset,      paint);
  111.                         cavas.drawLine(0, yoffset+oneG, maxx, yoffset+oneG, paint);
  112.                         cavas.drawLine(0, yoffset-oneG, maxx, yoffset-oneG, paint);
  113.                     }
  114.                     canvas.drawBitmap(mBitmap, 0, 0, null);

  115.                     float[] values = mOrientationValues;
  116.                     if (mWidth < mHeight) {
  117.                         float w0 = mWidth * 0.333333f;
  118.                         float w  = w0 - 32;
  119.                         float x = w0*0.5f;
  120.                         for (int i=0 ; i<3 ; i++) {
  121.                             canvas.save(Canvas.MATRIX_SAVE_FLAG);
  122.                             canvas.translate(x, w*0.5f + 4.0f);
  123.                             canvas.save(Canvas.MATRIX_SAVE_FLAG);
  124.                             paint.setColor(outer);
  125.                             canvas.scale(w, w);
  126.                             canvas.drawOval(mRect, paint);
  127.                             canvas.restore();
  128.                             canvas.scale(w-5, w-5);
  129.                             paint.setColor(inner);
  130.                             canvas.rotate(-values[i]);
  131.                             canvas.drawPath(path, paint);
  132.                             canvas.restore();
  133.                             x += w0;
  134.                         }
  135.                     } else {
  136.                         float h0 = mHeight * 0.333333f;
  137.                         float h  = h0 - 32;
  138.                         float y = h0*0.5f;
  139.                         for (int i=0 ; i<3 ; i++) {
  140.                             canvas.save(Canvas.MATRIX_SAVE_FLAG);
  141.                             canvas.translate(mWidth - (h*0.5f + 4.0f), y);
  142.                             canvas.save(Canvas.MATRIX_SAVE_FLAG);
  143.                             paint.setColor(outer);
  144.                             canvas.scale(h, h);
  145.                             canvas.drawOval(mRect, paint);
  146.                             canvas.restore();
  147.                             canvas.scale(h-5, h-5);
  148.                             paint.setColor(inner);
  149.                             canvas.rotate(-values[i]);
  150.                             canvas.drawPath(path, paint);
  151.                             canvas.restore();
  152.                             y += h0;
  153.                         }
  154.                     }

  155.                 }
  156.             }
  157.         }

  158.         public void onSensorChanged(SensorEvent event) {
  159.             //Log.d(TAG, "sensor: " + sensor + ", x: " + values[0] + ", y: " + values[1] + ", z: " + values[2]);
  160.             synchronized (this) {
  161.                 if (mBitmap != null) {
  162.                     final Canvas canvas = mCanvas;
  163.                     final Paint paint = mPaint;
  164.                     if (event.sensor.getType() == Sensor.TYPE_ORIENTATION) {
  165.                         for (int i=0 ; i<3 ; i++) {
  166.                             mOrientationValues[i] = event.values[i];
  167.                         }
  168.                     } else {
  169.                         float deltaX = mSpeed;
  170.                         float newX = mLastX + deltaX;

  171.                         int j = (event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD) ? 1 : 0;
  172.                         for (int i=0 ; i<3 ; i++) {
  173.                             int k = i+j*3;
  174.                             final float v = mYOffset + event.values[i] * mScale[j];
  175.                             paint.setColor(mColors[k]);
  176.                             canvas.drawLine(mLastX, mLastValues[k], newX, v, paint);
  177.                             mLastValues[k] = v;
  178.                         }
  179.                         if (event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD)
  180.                             mLastX += mSpeed;
  181.                     }
  182.                     invalidate();
  183.                 }
  184.             }
  185.         }

  186.         public void onAccuracyChanged(Sensor sensor, int accuracy) {
  187.         }
  188.     }

  189.     /**
  190.      * Initialization of the Activity after it is first created.  Must at least
  191.      * call {@link android.app.Activity#setContentView setContentView()} to
  192.      * describe what is to be displayed in the screen.
  193.      */
  194.     @Override
  195.     protected void onCreate(Bundle savedInstanceState) {
  196.         // Be sure to call the super class.
  197.         super.onCreate(savedInstanceState);

  198.         mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
  199.         mGraphView = new GraphView(this);
  200.         setContentView(mGraphView);
  201.     }

  202.     @Override
  203.     protected void onResume() {
  204.         super.onResume();
  205.         mSensorManager.registerListener(mGraphView,
  206.                 mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),
  207.                 SensorManager.SENSOR_DELAY_FASTEST);
  208.         mSensorManager.registerListener(mGraphView,
  209.                 mSensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD),
  210.                 SensorManager.SENSOR_DELAY_FASTEST);
  211.         mSensorManager.registerListener(mGraphView,
  212.                 mSensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION),
  213.                 SensorManager.SENSOR_DELAY_FASTEST);
  214.     }

  215.     @Override
  216.     protected void onStop() {
  217.         mSensorManager.unregisterListener(mGraphView);
  218.         super.onStop();
  219.     }
  220. }
复制代码


如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

 楼主| 发表于 2011-3-2 09:54:58 | 显示全部楼层
上一帖开始写了一堆话,发表时说超过字节限制,全部没了。
此例程是Android网站上的一个例子,我稍改了一点点。在Android 2.2下编译通过,在G7上可以正常运行。
我赶着出门,来不及截屏发图了,编译好的APK文件以及屏幕截图稍后再补。
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

 楼主| 发表于 2011-3-2 10:00:49 | 显示全部楼层
Android开发网站上关于传感器的介绍:
http://developer.android.com/ref ... re/SensorEvent.html
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

发表于 2011-3-2 21:23:52 | 显示全部楼层
我喜欢!爽!还是集体的力量大!
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

 楼主| 发表于 2011-3-3 09:10:29 | 显示全部楼层
grant7788 发表于 2011-3-2 09:54
上一帖开始写了一堆话,发表时说超过字节限制,全部没了。
此例程是Android网站上的一个例子,我稍改了一点 ...

这个是编译好的APK文件,
Sensors.rar (14.07 KB, 下载次数: 13)


以下是运行时的截图。
那个跳得很高的突变,是因为我的截图软件要摇晃才截图...
snap20110303_084940.png
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 马上注册

本版积分规则

QQ|手机版|中文乐高 ( 桂ICP备13001575号-7 )

GMT+8, 2024-3-19 17:15 , Processed in 0.088256 second(s), 18 queries .

Powered by Discuz! X3.5

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表