小编Tim*_*Tim的帖子

Android手机定位概述,包括指南针

我一直试图让我的头围绕Android方向传感器一段时间.我以为我明白了.然后我意识到我没有.现在我想(希望)我对它有更好的感觉,但我仍然不是100%.我将尝试解释我对它的不完整理解,并希望如果我在部分错误或填写任何空白,人们将能够纠正我.

我想我的经度是0度(本初子午线)和纬度0度(赤道).这个位置实际上位于非洲海岸附近的海域,但请耐心等待.我把手机放在我面前,这样手机的底部指向我的脚; 我面向北方(朝向格林威治),因此电话的右侧指向东方向非洲.在这个方向(参考下图)我的X轴指向东方,Z轴指向南方,Y轴指向天空.

现在,手机上的传感器可以让您在这种情况下计算设备的方向(而不是位置).这部分总是让我感到困惑,可能是因为我想在我接受它确实有效之前理解它是如何工作的.看起来这款手机采用了两种不同技术的组合来确定其方向.

在我做到这一点之前,想象一下,回到原来在上面提到的方向上经纬度为0度的那片想象中的土地上.想象一下,你被蒙住眼睛,你的鞋子固定在游乐场环形交叉路口.如果有人在后面推你,你会向前(向北)前进,然后伸出双手来打破你的摔倒.同样地,如果有人将你的左肩推开,你的右手就会摔倒.你的内耳有"引力传感器" (youtube clip),它可以让你检测你是向前/向后,向左/向下或向下(向上!!).因此,人类可以检测与手机相同的X和Z轴周围的对齐和旋转.

现在想象有人现在在环形交叉口旋转90度,这样你现在面向东方.您正在围绕Y轴旋转.这个轴是不同的,因为我们无法在生物学上检测它.我们知道我们有一定的角度,但我们不知道与行星的磁北极有关的方向.相反,我们需要使用外部工具......磁罗盘.这使我们能够确定我们面临的方向.我们的手机也是如此.

现在这款手机还配备了3轴加速度计.我知道它们是如何工作的,但我想象它的方式是将重力想象为从天空中落下的恒定和均匀的"雨"并想象上图中的轴作为可以检测流过的雨量的管.当手机直立时,所有下雨都会流过Y'管.如果手机逐渐旋转使其屏幕朝向天空,流过Y的雨量将减少到零,而通过Z的量将稳定增加,直到最大雨量流过.同样,如果我们现在将手机放在侧面,X管将最终收集最大量的雨水.因此,根据手机的方向,通过测量流过3管的雨量,您可以计算方向.

这款手机还有一个电子罗盘,其行为类似于普通罗盘 - 它的"虚拟针"指向磁北.的Android合并来自这两个传感器的信息,以使得每当一个SensorEventTYPE_ORIENTATION产生values[3]阵列具有
值[0]:方位角- (磁北的罗盘方位东)
的值[1]:节距,绕x轴旋转(是电话向前或向后倾斜)
值[2]:滚动,围绕y轴旋转(手机在其左侧或右侧倾斜)

所以我认为(即我不知道)Android给出方位角(罗盘方位)的原因而不是第三个加速度计的读数是指南针轴承更有用.我不确定为什么他们不赞成这种类型的传感器,因为现在看来你需要在系统中为SensorEvents类型注册一个监听器TYPE_MAGNETIC_FIELD.value[]需要将事件的数组转换为SensorManger.getRotationMatrix(..)方法以获得旋转矩阵(见下文),然后将其传递给SensorManager.getOrientation(..)方法.有谁知道为什么Android团队弃用了Sensor.TYPE_ORIENTATION?这是一种效率的东西吗?这是对类似问题的评论中隐含的内容,但您仍需要在development/samples/Compass/src/com/example/android/compass/CompassActivity.java示例中注册不同类型的侦听器.

我现在想谈谈旋转矩阵.(这是我最不确定的地方)所以上面我们有Android文档中的三个数字,我们称之为A,B和C.

A = SensorManger.getRotationMatrix(..)方法图并表示World的坐标系

B = SensorEvent API使用的坐标系.

C = SensorManager.getOrientation(..)方法图

所以我的理解是A代表"世界的坐标系",我认为它指的是地球上的位置作为(纬度,经度)夫妇与可选的(海拔)给出的方式.X是"东向"坐标,Y是"北向"坐标.Z指向天空并代表高度.

电话协调系统如图B所示是固定的.它的Y轴总是指向顶部.旋转矩阵由电话不断计算,并允许两者之间的映射.所以我认为旋转矩阵将B的坐标系转换为C是正确的吗?因此,当您调用SensorManager.getOrientation(..)方法时,您使用values[]具有与图C对应的值的数组.当手机指向天空时,旋转矩阵是单位矩阵(矩阵数学等价于1),这意味着当设备对齐时不需要映射与世界的坐标系统.

好.我想我现在最好停下来.就像我之前说的那样,我希望人们能告诉我在哪里搞砸了或帮助了人们(或者让人们更加困惑!)

android orientation bearing device-orientation compass-geolocation

106
推荐指数
1
解决办法
4万
查看次数

使用GSON序列化java对象

我想将此对象序列化为JSON String

public class Person {
   public String id;
   public String name;
   public Person parent;
}
Run Code Online (Sandbox Code Playgroud)

并获得这样的结果:

{id: 1, name: "Joe", parent: 2}
Run Code Online (Sandbox Code Playgroud)

我试着用

Person p = new Person(1, "Joe", new Person(2, "Mike"));
Gson gson = new GsonBuilder()
            .registerTypeAdapter(Persona.class, new PersonSerializer()).create();
String str = gson.toJson(p);
Run Code Online (Sandbox Code Playgroud)

但不是那样,我得到了:

"1"
Run Code Online (Sandbox Code Playgroud)

PersonSerializer:

public class PersonSerializer implements JsonSerializer<Person> {
    public JsonElement serialize(Person src, Type typeOfSrc, ...) {
        return new JsonPrimitive(src.id);
    }
}
Run Code Online (Sandbox Code Playgroud)

欢迎任何建议

谢谢,马里奥

java json gson

34
推荐指数
2
解决办法
7万
查看次数

Android SDK内容加载器因NullPointerException而失败

我刚刚开始在Eclipse Helios中与Android SDK和AVD Manager交互时遇到错误

我已经尝试重新安装Eclipse插件和Android SDK,但无济于事.

如果我转到"已安装的软件包"页面并单击刷新(或安装或删除软件包),我会弹出一个弹出框说

'Android SDK Content Loader' has encountered a problem. 
parseSdkContent failed 
java.lang.NullPointerException.
Run Code Online (Sandbox Code Playgroud)

这是完整的日志:

堆栈跟踪

java.lang.NullPointerException
   at com.android.ide.eclipse.adt.internal.sdk.Sdk.loadTarget(Unknown Source)
   at com.android.ide.eclipse.adt.AdtPlugin$10.run(Unknown Source)
   at org.eclipse.core.internal.jobs.Worker.run(Worker.java:54)
Run Code Online (Sandbox Code Playgroud)

会话数据

eclipse.buildId=M20100909-0800
java.version=1.6.0_20
java.vendor=Sun Microsystems Inc.
BootLoader constants: OS=linux, ARCH=x86, WS=gtk, NL=en_IE
Framework arguments:  -product org.eclipse.epp.package.java.product
Command-line arguments:  -os linux -ws gtk -arch x86 -product org.eclipse.epp.package.java.product
Run Code Online (Sandbox Code Playgroud)

最近有没有其他人遇到过这个?它似乎并没有影响实际的Android开发,但它只是有点烦人.

android nullpointerexception android-virtual-device

33
推荐指数
6
解决办法
5万
查看次数

在Android中的RadioGroup中获取RadioButton数组

有没有办法RadioButton在Android 中获取s 的数组(或集合)RadioGroup?我想将单个侦听器添加到单选按钮,但我没有看到任何明显的迭代方法.

arrays iteration android radio-group radio-button

27
推荐指数
1
解决办法
2万
查看次数

在Eclipse中创建Android Test项目

如何在目标项目的/test目录中在Eclipse中创建Android Test项目?

注意:根据Stackoverflow FAQ回答您自己的问题,我只是为人们做了自己的Q + A.

junit android unit-testing

27
推荐指数
1
解决办法
1万
查看次数

如何在Eclipse中获取Android API文档

我希望能够将Android api文档集成到Eclipse中,例如,如果将鼠标悬停在Activity类上,则会在弹出窗口中获得相应的Javadoc.

因此,要将Javadoc添加到Android,您需要在Eclipse中打开任何Android项目.定位"Android xx"库.在此右键单击android.jar文件并选择Properties.选择Javadoc位置条目.

在JavadocURL部分,我输入了http://developer.android.com/reference/packages.html并单击了Validate,但它给出了通常的错误

位置可能无效.尚未找到通常在Javadoc工具创建的文档的根目录中提供的文件'package-list'和'index.html'

我已尝试过该网址的大量变体,但无济于事.

我也不想不得不下载Android的源代码.

eclipse documentation android

21
推荐指数
2
解决办法
2万
查看次数

Eclipse Android图形布局编辑器已损坏

我在Mac上运行Eclipse Helios,刚刚更新到ADT 9.0.0.它似乎打破了布局编辑器.每当我尝试使用布局编辑器打开布局xml文件时,我都会收到错误.编辑器有一个"缺少主题"消息,而生成的主要错误如下.

 Selecting page '0' in AndroidXmlEditor failed    

java.lang.NullPointerException
at com.android.ide.eclipse.adt.internal.editors.layout.gle2.GraphicalEditorPart.renderWithBridge(Unknown Source)
at com.android.ide.eclipse.adt.internal.editors.layout.gle2.GraphicalEditorPart.recomputeLayout(Unknown Source)
at com.android.ide.eclipse.adt.internal.editors.layout.gle2.GraphicalEditorPart.activated(Unknown Source)
at com.android.ide.eclipse.adt.internal.editors.layout.LayoutEditor.pageChange(Unknown Source)
at org.eclipse.ui.part.MultiPageEditorPart.setActivePage(MultiPageEditorPart.java:1067)
at org.eclipse.ui.forms.editor.FormEditor.setActivePage(FormEditor.java:607)
at com.android.ide.eclipse.adt.internal.editors.AndroidXmlEditor.selectDefaultPage(Unknown Source)
at com.android.ide.eclipse.adt.internal.editors.AndroidXmlEditor.addPages(Unknown Source)
at org.eclipse.ui.forms.editor.FormEditor.createPages(FormEditor.java:138)
at org.eclipse.ui.part.MultiPageEditorPart.createPartControl(MultiPageEditorPart.java:348)
at org.eclipse.ui.internal.EditorReference.createPartHelper(EditorReference.java:670)
at org.eclipse.ui.internal.EditorReference.createPart(EditorReference.java:465)
at org.eclipse.ui.internal.WorkbenchPartReference.getPart(WorkbenchPartReference.java:595)
at org.eclipse.ui.internal.EditorReference.getEditor(EditorReference.java:289)
at org.eclipse.ui.internal.WorkbenchPage.busyOpenEditorBatched(WorkbenchPage.java:2863)
at org.eclipse.ui.internal.WorkbenchPage.busyOpenEditor(WorkbenchPage.java:2768)
at org.eclipse.ui.internal.WorkbenchPage.access$11(WorkbenchPage.java:2760)
at org.eclipse.ui.internal.WorkbenchPage$10.run(WorkbenchPage.java:2711)
at org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:70)
at org.eclipse.ui.internal.WorkbenchPage.openEditor(WorkbenchPage.java:2707)
at org.eclipse.ui.internal.WorkbenchPage.openEditor(WorkbenchPage.java:2691)
at org.eclipse.ui.internal.WorkbenchPage.openEditor(WorkbenchPage.java:2682)
at org.eclipse.ui.ide.IDE.openEditor(IDE.java:651)
at org.eclipse.ui.ide.IDE.openEditor(IDE.java:610)
at org.eclipse.jdt.internal.ui.javaeditor.EditorUtility.openInEditor(EditorUtility.java:365)
at org.eclipse.jdt.internal.ui.javaeditor.EditorUtility.openInEditor(EditorUtility.java:168)
at org.eclipse.jdt.ui.actions.OpenAction.run(OpenAction.java:229)
at org.eclipse.jdt.ui.actions.OpenAction.run(OpenAction.java:208)
at org.eclipse.jdt.ui.actions.SelectionDispatchAction.dispatchRun(SelectionDispatchAction.java:274)
at org.eclipse.jdt.ui.actions.SelectionDispatchAction.run(SelectionDispatchAction.java:250)
at org.eclipse.jdt.internal.ui.packageview.PackageExplorerActionGroup.handleOpen(PackageExplorerActionGroup.java:373)
at org.eclipse.jdt.internal.ui.packageview.PackageExplorerPart$4.open(PackageExplorerPart.java:526) …
Run Code Online (Sandbox Code Playgroud)

eclipse android android-layout

15
推荐指数
1
解决办法
3万
查看次数

如果应用程序被用户杀死,Android Geofences会被删除吗?

问题出在标题中.如果应用程序被用户杀死,新的Android Geofences是否会被删除?

我正在使用新的Android Geofences(在Google IO 2013上宣布).如果用户使用Android任务管理器删除/杀死应用程序,那么如果应用程序的Geofences被删除,我就无法解决问题.我认为使用旧的addProximityAlert技术它们并没有被删除.

android geofencing

15
推荐指数
1
解决办法
4476
查看次数

android:id,android:Android XML文件中的名称和名称标签之间的区别

有人可以明确的区别android:id,android:name以及name标签Android的XML文件.它们似乎都是引用事物的方法.

例如,当我在res/values/array.xml文件中有一个字符串数组时,我使用name定义数组中的字段访问,但Javadoc将其称为"ID".

android:id似乎只是在Views中使用?

我错过了什么,或者一个标签不简单吗?

android android-xml

12
推荐指数
1
解决办法
5866
查看次数

如何将ArrayList传递给期望vararg(Object ...)的方法?

假设具有以下签名的方法:

public static void foo(String arg1, String args2, Object... moreArgs);
Run Code Online (Sandbox Code Playgroud)

跑步时......

ClassName.foo("something", "something", "first", "second", "third");
Run Code Online (Sandbox Code Playgroud)

......我会的moreArgs[0] == "first",moreArgs[1] == "second"而且moreArgs[2] == "third".

但是假设我将参数存储在一个包含"first","second"和"third" 的ArrayList<String>被调用arrayList中.

我想打电话foomoreArgs[0] == "first",moreArgs[1] == "second"并且moreArgs[2] == "third"使用arrayList作为参数.

我天真的尝试是......

ClassName.foo("something", "something", arrayList);
Run Code Online (Sandbox Code Playgroud)

......但这会给我moreArgs[0] == arrayList一些不是我想要的东西.

传递arrayList给上述foo方法的正确方法是什么moreArgs[0] == "first",moreArgs[1] == "second"以及moreArgs[2] == "third"

请注意,arrayList …

java

11
推荐指数
1
解决办法
6668
查看次数