Android环境杂记

 

 

 

 

1)  Android环境搭建

l  JDK

下载地址

http://www.oracle.com/technetwork/java/javase/downloads/index.html

设置变量

JAVA_HOME

    JAVA_HOME 这个是安装

PATH

    %JAVA_HOME%\bin

CLASSPATH

    %JAVA_HOME%\lib\tools.jar

%JAVA_HOME%\lib\dt.jar

l  Eclipse

http://www.eclipse.org/downloads/

不需要安装

 

l  ADT

打开 Eclipse IDE,进入菜单中的 "Help" -> "Install New Software"

点击Add...按钮,弹出对话框要求输入Name和Location:Name自己随便取,Location输入http://dl-ssl.google.com/android/eclipse

确定返回后,在work with后的下拉列表中选择我们刚才添加的ADT,我们会看到下面出有Developer Tools,展开它会有Android DDMS和Android Development Tool,勾选他们

 

l  SDK

http://developer.android.com/sdk/index.html

安装路径 写到Path变量里面。

双击打开SDK Manager,一开始什么平台和工具也没有,需要下载回来

 

l  最后配置

Eclipse中选择Window> Preferences...

在左边的面板选择Android,然后在右侧点击Browse...并选中SDK路径,如下图

点击Apply、OK。配置完成。

 

l  概念介绍:

ADT(AndroidDevelopment Tools): 目前Android开发所用的开发工具是Eclipse,在Eclipse编译IDE环境中,安装ADT,为Android开发提供开发工具的升级或者变更,简单理解为在Eclipse下开发工具的升级下载工具。adt只是一个eclipse的插件,里面可以设置sdk路径     SDK(Software Development Kit): 一般是一些被软件工程师用于为特定的软件包、软件框架、硬件平台、操作系统等建立应用软件的开发工具的集合。在Android中,他为开发者提供了库文件以及其他开发所用到的工具。简单理解为开发工具包集合,是整体开发中所用到的工具包,如果你不用Eclipse作为你的开发工具,你就不需要下载ADT,只下载SDK即可开发。SDK可以自己编译,在linux环境下通过make命令进行

 

2)  基本操作

1.    全屏显示图片

首先:在 oncreate中输入如下,可以得到全屏的效果:

getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);

       requestWindowFeature(Window.FEATURE_NO_TITLE);

       setContentView(R.layout.picture);

         new CountDownTimer(3000,100) {

          @Override

          public void onTick(long millisUntilFinished) {

          // TODO Auto-generated method stub

          

         }

               @Override

               public void onFinish() {    //倒计时结束后在这里实现activity跳转

                Intent intent = new Intent();                  

                intent.setClass(getApplicationContext(), Second.class);

                startActivity(intent);

                finish();                  //跳转后销毁自身的activity  否则按返回还会跳回到图片

               }

                     }.start();

 

可以得到全屏

然后:

在AndroidMain.xml 中,修改主题如下,可以去掉全屏前的时间差,跳回去的Activity需要修改回主题。:

android:theme="@android:style/Theme.NoTitleBar"

 

2.    禁止锁屏

 

在onCreate函数中加入如下:

 

protected void onCreate(final BundlesavedInstanceState) {

….

                     getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);

…..

}        

 

 

3.    锁定横屏

xml文件中设置:

  要实现这个目的,只需要在AndroidManifest.xml里声明Activity的时候加上一个属性:android:screenOrientation,属性取值landscape为固定横屏、portrait为固定纵屏幕。

  代码:

  setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE););//强制为横屏

  setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);//竖屏

  ============延伸========

  屏幕会自动切换时,默认状态的应用程序,会重新调用onCreate,相当于重新启动了一次应用程序。同时,layout可能因为横屏带来不能合理适配的问题。为了解决旋屏和键盘切换引起的程序重启问题,还需要增加一个属性:android:configChanges。这个属性可以理解为一个监听器,它将拦截旋屏和键盘切换事件,阻止程序重启而变为回调onConfigurationChanged方法。这里常用的属性取值为:keyboardHidden|orientation。

 

4.    播放背景音乐

首先在XML文件中加入:

   <service android:name="com.example.test1.MusicServer">

  </service>

然后再主的ACTIVITY文件中ONCREATE中的加入:

Intentintent1 = new Intent(getApplicationContext(),MusicServer.class);

       startService(intent1);

再添加onDestroy函数

       protected void onDestroy() {

           // TODO Auto-generated method stub

           super.onDestroy();

           Intent intent1 = new Intent(getApplicationContext(),MusicServer.class);

           stopService(intent1);

       }

最后添加类MusicServer 即可:

public class MusicServer extends Service {

    private MediaPlayer mediaPlayer = null;

 

    @Override

    public IBinder onBind(Intent intent) {

       // TODOAuto-generated method stub

       return null;

    }

    @Override

    public int onStartCommand(Intent intent, int flags, int startId) {

       // TODOAuto-generated method stub

      

       if (mediaPlayer == null) {

 

           // R.raw.mmp是资源文件,MP3格式的

           mediaPlayer = MediaPlayer.create(this, R.raw.bro);

           mediaPlayer.setLooping(true);

           mediaPlayer.start();

          

      

       }

       return super.onStartCommand(intent, flags, startId);

      

    }

 

    @Override

    public void onDestroy() {

       // TODOAuto-generated method stub

       super.onDestroy();

       if( mediaPlayer != null){

           mediaPlayer.stop();

          

       }

      

    }

   

}

 

 

5.    手机图片大小

     Android手机屏幕标准      对应图标尺寸标准   屏幕密度

xhdpi              1280*720                             96*96             320

hdpi                480*800                             72*72             240

mdpi               480*320                             48*48             160

ldpi                 320*240                              36*36             120

 

6.    布局背景图片设置

只需要在该布局的XML文件中,设置

android:background="@drawable/bk" 

即可,需要放置照片在对应的文件夹里面。

 

 

7.    窗口实现

只需要将要显示的 ACTIVITY在 androidMain.xml中设置:

android:theme="@android:style/Theme.Dialog"

 

 

8.    Imageview 实现原图大小

在 layout.xml中加入如下:

android:scaleType="center"

注意:

ImageView的scaleType属性值说明:
(01) ImageView.ScaleType.CENTER|android:scaleType="center"
    以原图的几何中心点和ImagView的几何中心点为基准,按图片的原来size居中显示,不缩放,当图片长/宽超过View的长/宽,则截取图片的居中部分显示ImageView的size.当图片小于View 的长宽时,只显示图片的size,不剪裁。
(02)ImageView.ScaleType.CENTER_CROP|android:scaleType="centerCrop"
    以原图的几何中心点和ImagView的几何中心点为基准,按比例扩大(图片小于View的宽时)图片的size居中显示,使得图片长 (宽)等于或大于View的长(宽),并按View的大小截取图片。当原图的size大于ImageView时,按比例缩小图片,使得长宽中有一向等于ImageView,另一向大于ImageView。实际上,使得原图的size大于等于ImageView
(03)ImageView.ScaleType.CENTER_INSIDE|android:scaleType="centerInside"
    以原图的几何中心点和ImagView的几何中心点为基准,将图片的内容完整居中显示,通过按比例缩小原来的size使得图片长(宽)等于或小于ImageView的长(宽)
(04) ImageView.ScaleType.FIT_CENTER|android:scaleType="fitCenter"
    把图片按比例扩大(缩小)到View的宽度,居中显示
(05) ImageView.ScaleType.FIT_END|android:scaleType="fitEnd"
    把图片按比例扩大(缩小)到View的宽度,显示在View的下部分位置
(06) ImageView.ScaleType.FIT_START|android:scaleType="fitStart"
    把图片按比例扩大(缩小)到View的宽度,显示在View的上部分位置
(07) ImageView.ScaleType.FIT_XY|android:scaleType="fitXY"
    把图片按照指定的大小在View中显示,拉伸显示图片,不保持原比例,填满View.
(08) ImageView.ScaleType.MATRIX|android:scaleType="matrix"
    用matrix来绘制

 

9.    获取手机屏幕大小

在代码中定义一个DisplayMetrics类对象

        DisplayMetrics displaysMetrics=new DisplayMetrics();

        //DisplayMetrics 一个描述普通显示信息的结构,例如显示大小、密度、字体尺寸

获取手机窗口的Display来初始化DisplayMetrics对象

         getWindowManager().getDefaultDisplay().getMetrics(displaysMetrics);

        //getManager()获取显示定制窗口的管理器。

        //获取默认显示Display对象

        //通过Display对象的数据来初始化一个DisplayMetrics对象

得到屏幕宽高

      displaysMetrics.widthPixels

displaysMetrics.heightPixels;

 

10.  获取手机号码,识别运营商

TelephonyManager tm = (TelephonyManager) this.getSystemService(Context.TELEPHONY_SERVICE);

                 

                   String deviceid = tm.getDeviceId();

                   String tel = tm.getLine1Number();

                   String imei = tm.getSimSerialNumber();    

                   String imsi = tm.getSubscriberId();

在AndroidMain.xml 中 添加权限如下:

<uses-permissionandroid:name="android.permission.READ_PHONE_STATE" />

注意使用如下代码可以识别运行商:

if(imsi.startsWith("46000") || imsi.startsWith("46002")) { 

               tel = tel+"中国移动"

               tView.setText(tel);

           } else if (imsi.startsWith("46001")) { 

            tel = tel+ "中国联通"

               tView.setText(tel);

           } else if (imsi.startsWith("46003")) { 

            tel = tel+ "中国电信"

               tView.setText(tel);

           } 

问题:

  手机号码不是所有的都能获取。只是有一部分可以拿到。这个是由于移动运营商没有把手机号码的数据写入到sim卡中.SIM卡只有唯一的编号,供网络与设备识别那就是IMSI号码,手机的信号也可以说是通过这个号码在网络中传递的,并不是手机号码。试想,你的SIM丢失后,补办一张新的会换号码吗?是不会的.就是因为在你的手机号码对应的IMSI号在移动运营商中被修改成新SIM卡的IMSI号码。 

对于移动的用户,手机号码(MDN)保存在运营商的服务器中,而不是保存在SIM卡里。SIM卡只保留了IMSI和一些验证信息。手机每次入网注册的时候,都会以短信的形式将IMSI及验证信息上传到运营商的服务器,服务器在完成注册动作之后,会以短信的形式将注册的结果下发到手机里。下发的内容会因条件不同而不同。 
    如果服务器在下发的短信中,不包含手机的号码,手机是无法取得电话号码。如果短信中包含了号码,手机才会将其缓存,以备他用.此外,对于其他运行商的SIM卡或者UIM卡,MDN有可能保存在UIM卡中。100%能够取得本机号码不太可能。 
    移动神州行,联通的卡是可以取到的.动感地带的取不到.别的卡还没有试过. 
    能够读取SIM卡号的话应该有前提.那就是SIM卡已经写入了本机号码,不然是无法读取的。

 

 

11.  获取手机经纬度

获取地理位置有主要方法

1、  通过GPS,需要卫星,SIM卡

2、  通过 基站 需要 网络

目前手机上被广泛使用的移动定位技术有三种:基于网络的小区识别定位、集成GPS定位和A-GPS定位。

 

首先:增加权限

< uses-permissionandroid:name="android.permission.ACCESS_FINE_LOCATION">
< /uses-permission>

然后:

在 oncreate 中输入代码:

----------------------------------------------------------------------------------------------------------------

LocationManagerloctionManager;

       String contextService=Context.LOCATION_SERVICE;

       loctionManager=(LocationManager)getSystemService(contextService);

           

       String provider=LocationManager.GPS_PROVIDER;

       Location location =loctionManager.getLastKnownLocation(provider);

       Criteria criteria = new Criteria();

       criteria.setAccuracy(Criteria.ACCURACY_FINE);//高精度

       criteria.setAltitudeRequired(false);//不要求海拔

       criteria.setBearingRequired(false);//不要求方位

       criteria.setCostAllowed(true);//允许有花费

       criteria.setPowerRequirement(Criteria.POWER_LOW);//低功耗

       provider =loctionManager.getBestProvider(criteria, true);

       location= loctionManager.getLastKnownLocation(provider);

 

updateWithNewLocation(location);

       loctionManager.requestLocationUpdates(provider,2000, 10,

              locationListener);

//添加辅助函数

private final LocationListener locationListener = new LocationListener() {

       public void onLocationChanged(Location location) {

           updateWithNewLocation(location);

       }

 

       public void onProviderDisabled(String provider) {

           updateWithNewLocation(null);

       }

 

       public void onProviderEnabled(String provider) {

       }

 

public void onStatusChanged(String provider, int status, Bundle extras) {

       }

    };

 

    private void updateWithNewLocation(Locationlocation) {

       String latLongString;

       TextView myLocationText;

       myLocationText = (TextView)findViewById(R.id.tip);

       if (location != null) {

           double lat = location.getLatitude();

           double lng = location.getLongitude();

           latLongString = "纬度:" + lat + "\n经度:" + lng;

       } else {

           latLongString = "无法获取地理信息";

       }

       myLocationText.setText("您当前的位置是:\n" + latLongString);

    }

 

--------------------------------------------------------------------

具体解释如下:

LocationManager loctionManager;
String contextService=Context.LOCATION_SERVICE;
//通过系统服务,取得LocationManager对象
loctionManager=(LocationManager) getSystemService(contextService);


       3. 得到位置提供器,通过位置提供器,得到位置信息,可以指定具体的位置提供器,也可以提供一个标准集合,让系统根据标准匹配最适合的位置提供器,位置信息是由位置提供其提供的。

  a. 通过GPS位置提供器获得位置(指定具体的位置提供器)

Java代码:
String provider=LocationManager.GPS_PROVIDER;
Location location = loctionManager.getLastKnownLocation(provider);


       b. 使用标准集合,让系统自动选择可用的最佳位置提供器,提供位置

Java代码:
Criteria criteria = new Criteria();
criteria.setAccuracy(Criteria.ACCURACY_FINE);//高精度
criteria.setAltitudeRequired(false);//不要求海拔
criteria.setBearingRequired(false);//不要求方位
criteria.setCostAllowed(true);//允许有花费
criteria.setPowerRequirement(Criteria.POWER_LOW);//低功耗
//从可用的位置提供器中,匹配以上标准的最佳提供器
String provider = loctionManager.getBestProvider(criteria, true);
//获得最后一次变化的位置
Location location = loctionManager.getLastKnownLocation(provider);
//监听位置变化,2秒一次,距离10米以上
private final LocationListener locationListener = new LocationListener()

 

12.  经纬度在地图上显示

具体参见:http://developer.baidu.com/map/sdkandev-2.htm#.E7.AE.80.E4.BB.8B1

首先在AndroidMain.xml中加入如下:

    <uses-permission android:name="android.permission.READ_PHONE_STATE" />

    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>

    <!-- 使用网络功能所需权限 -->

    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE">

    </uses-permission>

    <uses-permission android:name="android.permission.INTERNET" >

    </uses-permission>

    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE">

    </uses-permission>

    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE">

    </uses-permission>

    <!-- SDK离线地图和cache功能需要读写外部存储器 -->

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE">

    </uses-permission>

    <uses-permission android:name="android.permission.WRITE_SETTINGS" >

    </uses-permission>

    <!-- 获取设置信息和详情页直接拨打电话需要以下权限 -->

    <uses-permission android:name="android.permission.READ_PHONE_STATE">

    </uses-permission>

    <uses-permission android:name="android.permission.CALL_PHONE" >

    </uses-permission>

    <!-- 使用定位功能所需权限,demo已集成百度定位SDK,不使用定位功能可去掉以下6 -->

    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION">

    </uses-permission>

 

    <permission android:name="android.permission.BAIDU_LOCATION_SERVICE">

    </permission>

 

    <uses-permission android:name="android.permission.BAIDU_LOCATION_SERVICE">

    </uses-permission>

    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION">

    </uses-permission>

    <uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION">

    </uses-permission>

    <uses-permission android:name="android.permission.ACCESS_GPS" />

 

    <supports-screens

        android:anyDensity="true"

        android:largeScreens="true"

        android:normalScreens="false"

        android:resizeable="true"

        android:smallScreens="true"/>

<application

        …..

        <meta-data

            android:name="com.baidu.lbsapi.API_KEY"

            android:value="MNAQ5dKGDFzXUrbhWwQ2VZ7B"/>

………..

 

然后设置XML:

<?xmlversion="1.0" encoding="utf-8"?>

<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"

           android:orientation="vertical"

           android:layout_width="fill_parent"

           android:layout_height="fill_parent">

            <TextViewandroid:layout_width="fill_parent"

                   android:layout_height="wrap_content"

                    android:text="helloworld" />

            <com.baidu.mapapi.map.MapView android:id="@+id/bmapsView"

                   android:layout_width="fill_parent"

                   android:layout_height="fill_parent"

                   android:clickable="true" />

</LinearLayout>

最后代码:

BMapManagermBMapMan = null;

MapViewmMapView = null;

super.onCreate(savedInstanceState);

mBMapMan=newBMapManager(getApplication());

mBMapMan.init(null);

//注意:请在试用setContentView前初始化BMapManager对象,否则会报错

setContentView(R.layout.activity_main);

mMapView=(MapView)findViewById(R.id.bmapsView);

mMapView.setBuiltInZoomControls(true);

//设置启用内置的缩放控件

MapControllermMapController=mMapView.getController();

// 得到mMapView的控制权,可以用它控制和驱动平移和缩放

GeoPoint point=new GeoPoint((int)(39.915* 1E6),(int)(116.404* 1E6));

//用给定的经纬度构造一个GeoPoint,单位是微度 (度 * 1E6)

mMapController.setCenter(point);//设置地图中心点

mMapController.setZoom(12);//设置地图zoom级别@Override

protected voidonDestroy(){

        mMapView.destroy();

        if(mBMapMan!=null){

                mBMapMan.destroy();

                mBMapMan=null;

        }

        super.onDestroy();

}

@Override

protected voidonPause(){

        mMapView.onPause();

        if(mBMapMan!=null){

               mBMapMan.stop();

        }

        super.onPause();

}

@Override

protected voidonResume(){

        mMapView.onResume();

        if(mBMapMan!=null){

                mBMapMan.start();

        }

       super.onResume();

}

即可。

 

 

 

13.  显示一个加载过程对话框

代码如下:

// 类型 变量名 = 新申请ProgressDialog类型的空间,this指的是本对象,当前编写的类实例化后所产生的对象。

                     ProgressDialog mProgressDialog = newProgressDialog(this);

                     // 输出提示信息Now Loading......

                     mProgressDialog.setMessage("NowLoading......");

                     // setProgressStyle设置进度条

                     mProgressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);

                     // 开始展示Dialog的界面

                     mProgressDialog.show();

 

//dismiss表示结束会话.

             mProgressDialog.dismiss();

 

 

14.  加载cocos2d android 源码

Eclipse中 import代码,即可。在属性中去掉 libs库选项。

删除 JAR包,cocos2d-android.jar

如果出现错误,把API版本提高一点即可。

ACTION_POINTER_DOWN cannot be resolved or isnot a field 

 

 

15.  Cocos2d基本结构

a.  义 变量privateCCGLSurfaceView view=null ;

 

b.  创建图层类

package com.example.firstgame;

 

importorg.cocos2d.layers.CCLayer;

 

public classGameLayer extends CCLayer{

    public GameLayer(){

      

      

    }

}

 

c.   创建导演,添加CCGLSurfaceView,通过CCDirector设置属性,增加场景CCScene,

关联场景和 图层,运行场景。以下代码在oncreate中即可。

view=new CCGLSurfaceView(this);

       setContentView(view);

       CCDirectordirector=CCDirector.sharedDirector();

       director.attachInView(view);

       //设置FPS值

       director.setDisplayFPS(true);

       //设置游戏一帧需要的时间

       director.setAnimationInterval(1/30.0);

      

       CCScene scene=CCScene.node();

      

       GameLayer gameLayer=new GameLayer();

       scene.addChild(gameLayer);

      

       director.runWithScene(scene);

 

 

16.  游戏精灵设置-----游戏开发基本知识

COCOS2D的 坐标原点在 左下角。

源码如下:

public class GameLayer extends CCLayer {

 

    // 声明一个精灵对象

    CCSprite player;

 

    public GameLayer() {

       // 初始化精灵对象

       player = CCSprite.sprite("player.png");

       // 设置精灵对象的位置,原点是在左下角

       player.setPosition(100, 100);

 

       // CGPoint通常用于表示坐标,向量

       // CGPoint point=CGPoint.ccp(100,100);

       // 将精灵对象添加至布景层当中

       this.addChild(player);

 

       CGPoint point = CGPoint.ccp(150,100);

       // 生成一个CCJump对象

       CCJumpTo jumpTo = CCJumpTo.action(3,point, 200, 1);

 

       // 使用精灵对象执行该动作

       player.runAction(jumpTo);

 

    }

}

 

 

17.  CCAction游戏动作类

 

CGPoint point=CGPoint.ccp(100,150);

       CCFlipY pX=CCFlipY.action(true);

       player.runAction(pX);

      

       CCMoveTo moveTo = CCMoveTo.action(2,point);

       player.runAction(moveTo);

      

       CCRotateTo rotateTo=CCRotateTo.action(3,45);

       player.runAction(rotateTo);

 

使用CCBlink 精灵执行完动作之后,消失不见了,百度谷歌了一番,得知有可能出现精灵刚好到透明的那部分,所以最好在精灵执行完动作之后,让精灵setvisible显示出来。

 

 

18.  精灵按步骤或同时执行动作

使用CCSequence 按步骤执行

CCSequence ccSequence=CCSequence.actions(moveTo,rotateTo);

       player.runAction(ccSequence);

使用CCSpawn,同时执行步骤

CCSpawn ccSpawn=CCSpawn.actions(moveTo,rotateTo);

       player.runAction(ccSpawn);

 

19.  图层接收触摸

 

开启触摸屏功耗。

this.setIsTouchEnabled(true);

覆盖程序:

    //用户离开

    @Override

    public boolean ccTouchesEnded(MotionEvent event) {

       // TODOAuto-generated method stub

       System.out.println("end");

       return super.ccTouchesEnded(event);

    }

   

    //用户移动屏幕

    @Override

    public boolean ccTouchesMoved(MotionEvent event) {

       // TODOAuto-generated method stub

       System.out.println("move");

       return super.ccTouchesMoved(event);

    }

 

通过 event.getX()可以得到X轴坐标。

但是android和 COCOS2D的 坐标原点有些不一样。

将android的坐标换成cocos2d的坐标只需要执行如下

    Float x=event.getX();

       Float y=event.getY();

       CGPoint p1=CGPoint.ccp(x, y);

       CGPoint point2=CCDirector.sharedDirector().convertToGL(p1);

 

 

20.  游戏时间调度

//每秒调用fun函数

This.schedule(“fun”,1);

 

Public voidfun(float delta){

   

}

 

 

 

 

21.         ECLIPSE工程项目出现一个叹号

红色感叹号,如果你是倒的别人的项目,那就是你项目的jar包引用路径错误,把jar包全部干掉,然后引用你机子里的路径就行了

项目->Build path->configure Build path

可以进行删除。

 

22.         发布应用到android市场

 

 

 

 

辅助知识

A.手机定位

一、基于网络

        即小区识别定位技术。GSM移动通信网络是由许多像蜂窝一样的小区构成的,每个小区都有自己的编号,由于手机通讯遵循蜂窝技术规范,因此只要手机不是离线模式,手机位于哪个小区就很容易知道,这种定位精度取决于移动终端所处蜂窝小区半径的大小,从几百米到几十公里不等,与其它技术相比,该技术精度最低,而且还会收取一定的月功能使用费。

二、集成GPS

       即美国go-vern-ment提供的全球定位系统。24颗GPS卫星分布在6个道平面上,距离地面1万2千公里,以12小时的周期环绕地球运行,使得任意时刻地面上任意点都可以观测到4颗以上的卫星。集成GPS定位需要手机内置GPS模块,但该模块只有接收功能,没有发射功能。24颗GPS卫星不断向地球发射着包含时间、卫星点位等重要参数的信息,被我们的手机收到后,手机会利用多个卫星的同一时间发出的信号到达的先后顺序及时差计算出手机到各个卫星的距离,然后利用三维坐标中的距离公式,利用3颗卫星组成3个方程式,解算出手机的位置(X,Y,Z)。考虑到卫星时钟与手机时钟之间的误差,实际上有4个未知数,X、Y、Z和钟差,因而需要引入第4颗卫星,形成4个方程式进行求解,从而得到手机的经纬度和高程。事实上,手机往往可以锁住4颗以上的卫星,这时,手机可按卫星的星座分布分成若干组,每组4颗,然后通过算法挑选出误差最小的一组用作定位。

三、辅助GPS

即Assist GPS,简称A-GPS,是网络辅助的全球定位系统,这种方法实际就是"小区识别定位 + 集成GPS定位 + 远端数据计算 + GPRS信息传输"。辅助GPS定位需要移动运营商提供其移动通信信号塔的GPS位置,并在移动网络上加建位置服务器,还需要在地面建设GPS基准站(用于实时观测卫星并向定位服务器提供全球实时星历数据)。

       辅助GPS定位过程如下:

1、手机将距离最近的移动通信信号塔的GPS位置通过网络传输到位置服务器;

2、位置服务器(由GPS基准站提供全球即时星历数据)根据移动通信信号塔的GPS位置传输该信号塔(近似手机位置)当前上空的GPS星历信息到手机,这些信息将暂时保存在手机内存的特定位置(星历缓存);

3、手机从星历缓存读取数据并接收指定几颗卫星的信号(省去了繁重的信号接收、数据计算和筛选最优卫星分组等工作);

4、手机接收到指定几颗卫星的信号后,参考星历缓存中的位置信息(主要是仰角)校核计算出手机当前的位置,然后在屏幕上显示出来(警告:如果此时上空没有指定卫星信号(比如手机位于室内),则会从第1步往下重复,请小心你的流量);

5、手机随时间的变化(时间变化造成卫星偏移)和位置的移动(位置移动造成仰角改变)自动选择卫星,实时刷新星历缓存;

6、手机重复第3、第4和第5步骤。

7、其他重要环节的说明:①.如果手机有过一次成功定位,那么手机内存中就会有一个星历缓存,其中保存着上次的定位信息,退出定位软件也不会丢失,但一关机就没了。②. 每次启动GPS后,模块首先读取星历缓存,然后尝试上次定位的卫星信号,接着会有两种情况:a. 如果存在上次定位的卫星信号,则会立刻定位,屏幕不出现连网提示符,这就是为什么相对上次定位时间间隔和位置移动不大时一打开定位软件就能定位的原因;b. 如果不存在上次定位的卫星信号,则星历缓存失效,手机从第1步开始重做所有步骤,屏幕出现连网提示符。

四、手机GPS模块概述

     (一)GPS模块由信号接收硬件和数据处理软件两部分组成。数据处理软件是固化在主板芯片中的,跟电脑的BIOS一样,介于软件与硬件之间,说它软是因为通过特殊设备可以刷写它,说它硬是因为一般用户根本动不了它。A-GPS与纯GPS的不同之处,就是A-GPS比纯GPS在数据处理软件上多了一段联网获取辅助数据的程序。

GPS的工作过程概括如下(3、4部分为A-GPS的特色任务,设置中不勾选A-GPS或者由星历缓存锁定卫星成功后将不被执行):

1、读取手机内存中的星历缓存(上次的定位信息);

2、锁定卫星并接收信号;

3、调用移动通讯网络将当前通讯基站的GPS位置发送给专业定位服务器;

4、接收专业定位服务器发来的当前通讯基站当前上空的GPS星云数据并写入手机内存中的星历缓存;

5、校核仰角并计算显示;

6、自主选星并刷新缓存(退出定位也不会丢失);

7、重复第1、2、5、6步骤。

    (二)修改系统参数(实际是服务器地址)的方法能提高gps定位速度实际是提高A-GPS定位速度,只是把国外的服务器换成中国服务器而已,实际并不能提高单纯用gps定位的速度,gps定位的速度排除位置原因导致的卫星信号强度变化外,实际只和天线的接受能力以及芯片的处理能力有关,必须注意的是,GPS模块的数据处理软件部分位于专门的芯片中,并不在系统ROM中,因此通过DIY固件的方法也无法修改

    看了这些,我想大家不要纠结于什么rom定位快,什么rom定位慢的问题了,就算是速度上有影响,也是关于AGPS服务器地址的设置不同,如果不开辅助定位的话,理论上,同一位置冷启动定位速度相同,当然,卫星信号在传播过程中受到的影响很多,卫星的位置、大气密度、空气质量、电离层反射、折射、衍射等等都会对无线电波的传播产生影响,所以在相同地点不同时间定位速度也不可能相同。

    另外就是有些同学说过的秒定,这个现象我也能做到,深入的我没有研究过,但是和我用的其他系统的手机比较,我感觉这个情况应该是导航软件或者安卓系统对gps所做的一个优化设计,和热启动的原理差不多,如果是距离上次距离很远,定位时间间隔比较长,并且期间gps一直没有打开,关闭网络辅助的情况下(真正的冷启动),定位能在1分钟之内完成就很值得庆幸了。

    另外就是D2G这个手机本身情况也不同,就像有的同学手机信号好,不跳水,有的重启有的不重启一样,对于gps信号的接收能力各个机器也可能不同,所以定位表现也不同,这个帖子的目的就是让大家了解一下原理,真正能不能起到提高的作用,我没有办法,毕竟这个手机还不是专业的gps接收机也不是专业的导航手机,表现的再好也是有限度的。

    最后就是关于D2G的定位表现,从我的手机上看,接收信号能力和搜星能力都还不错,但是对于信号要求稍微高一点,经常是很快能搜到4颗以上的卫星,但是信号强度都达不到定位的阀值要求,要等一会才行。关闭gps,地点移动不大,间隔时间不长的情况下,热启动基本能做到秒定。总体上和我另外一部WM系统的garmin-asus M10的gps比稍有差距,但是作为一个非专业gps手机来讲不错了。

 

 

B.游戏基础知识

 

C.Cocos2d基本概念讲解

 

D.Cocos2d版本发展

和 cocos2d iphone并列的还有一个 cocos2d-android版本。

 

E.Cocos2d-x引擎介绍

 

F.游戏引擎

 

 

3)  ERROR集合

 

1.     项目出现红色感叹号

右键项目 BuildPath --->Configure Build Paht...,进入管理包界面。

然后在上面选项卡找到 Libraries点击,出现红色叉号的包为路径错误的包,刚刚我的已经修正,现在没有错误。(如果看你的包是有叉号,那就看看你的包路径是否正确)

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值