热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Android开发笔记之简单基站定位程序的实现

这篇文章主要介绍了Android开发笔记之简单基站定位程序的实现,详细的介绍了基站定位其实很简单,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。

经过学习,已经对Android程序的开发流程有了个大体的了解,为了提高我们的学习兴趣,在这一节我们将编写一个简单的基站定位程序。现在LBS(Location Based Service,基于位置的服务)移动应用相当流行(如:微信,切客,嘀咕,街旁等),基站定位是这类程序用到的关键性技术之一,我们来揭开它的神秘面纱吧。

在这一节里,我们会接触到事件、TelephonyManager、HTTP通信、JSON的使用等知识点。

在Android操作系统下,基站定位其实很简单,先说一下实现流程:

调用SDK中的API(TelephonyManager)获得MCC、MNC、LAC、CID等信息,然后通过google的API获得所在位置的经纬度,最后再通过google map的API获得实际的地理位置。(google真牛!)

有同学会问:MNC、MCC、LAC、CID都是些什么东西?google又怎么通过这些东西就获得经纬度了呢?

我们一起来学习一下:

MCC,Mobile Country Code,移动国家代码(中国的为460);

MNC,Mobile Network Code,移动网络号码(中国移动为00,中国联通为01);

LAC,Location Area Code,位置区域码;

CID,Cell Identity,基站编号,是个16位的数据(范围是0到65535)。

了解了这几个名词的意思,相信有些朋友已经知道后面的事了:google存储了这些信息,直接查询就能得到经纬度了。(至于google怎么得到移动、联通的基站信息,这就不得而知了,反正google免费提供接口,直接调用就是)

下面开始动手。

一、设置界面

我们在上一节的程序的基础上进行开发,在DemoActivity的界面上实现这个功能。

首先我们将DemoActivity使用的布局修改一下:

第1行为TextView,显示提示文字;第2行为一个Button,触发事件;第3行、第4行分别显示基站信息和地理位置(现在为空,看不到)。

layout/main.xml文件内容如下:

<&#63;xml version="1.0" encoding="utf-8"&#63;>

 
  
 
  

接下来我们打开DemoActivity.java编写代码。

二、为按钮绑定事件

我们在Activity创建时绑定事件,将以下代码添加到setContentView(R.layout.main);后:

/** 为按钮绑定事件 */
Button btnGetLocation = (Button)findViewById(R.id.button1);
btnGetLocation.setOnClickListener(new OnClickListener() {
  @Override
  public void onClick(View arg0) {
    // TODO Auto-generated method stub
    onBtnClick();
  }
});

同时还需要在头部import相关组件:

import android.view.View;
import android.widget.Button;
import android.view.View.OnClickListener;

我们来分析一下这段代码:

首先我们通过findViewById(R.id.button1)找到按钮这个对象,前面加(Button)表示显示的转换为Button对象;

然后设置按钮点击事件的监听器,参数为OnClickListener对象,再重载这个类的onClick方法,调用onBtnClick方法(这个方法得由我们自己去写,他在点击按钮时被调用)。

好了,调用方法写好了,我们来写实现(调用后需要做什么事)。动手编码之前先在脑中整理好思路,养成好习惯。

我们需要在DemoActivty类中添加如下私有方法:

我们需要刚刚提到的onBtnClick回调方法,被调用时实现取得基站信息、获取经纬度、获取地理位置、显示的功能。但是很显然,全部揉到一个方法里面并不是个好主意,我们将它分割为几个方法;

  • 添加获取基站信息的方法getCellInfo,返回基站信息;
  • 添加获取经纬度的方法getItude,传入基站信息,返回经纬度;
  • 添加获取地理位置的方法getLocation,传入经纬度,返回地理位置;
  • 添加显示结果的方法showResult,传入得到的信息在界面上显示出来。

好了,先将方法添上,完整代码如下:

package com.android.demo;
 
import android.R.bool;
import android.R.integer;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.view.View.OnClickListener;
 
public class DemoActivity extends Activity {
  /** Called when the activity is first created. */
  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
     
    /** 为按钮绑定事件 */
    Button btnGetLocation = (Button)findViewById(R.id.button1);
    btnGetLocation.setOnClickListener(new OnClickListener() {
      @Override
      public void onClick(View arg0) {
        // TODO Auto-generated method stub
        onBtnClick();
      }
    });
  }
   
  /** 基站信息结构体 */
  public class SCell{
    public int MCC;
    public int MNC;
    public int LAC;
    public int CID;
  }
   
  /** 经纬度信息结构体 */
  public class SItude{
    public String latitude;
    public String longitude;
  }
   
  /** 按钮点击回调函数 */
  private void onBtnClick(){
     
  }
   
  /** 获取基站信息 */
  private SCell getCellInfo(){
 
  }
   
  /** 获取经纬度 */
  private SItude getItude(SCell cell){
     
  }
   
  /** 获取地理位置 */
  private String getLocation(SItude itude){
     
  }
   
  /** 显示结果 */
  private void showResult(SCell cell, String location){
     
  }
}

现在在onBtnClick方法中编码,依次调用后面几个方法,代码如下:

/** 按钮点击回调函数 */
private void onBtnClick(){
  /** 弹出一个等待状态的框 */
  ProgressDialog mProgressDialog = new ProgressDialog(this);
  mProgressDialog.setMessage("正在获取中...");
  mProgressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
  mProgressDialog.show();
   
  try {
    /** 获取基站数据 */
    SCell cell = getCellInfo();
     
    /** 根据基站数据获取经纬度 */
    SItude itude = getItude(cell);
     
    /** 获取地理位置 */
    String location = getLocation(itude);
     
    /** 显示结果 */
    showResult(cell, location);
     
    /** 关闭对话框 */
    mProgressDialog.dismiss();
  }catch (Exception e) {
    /** 关闭对话框 */
    mProgressDialog.dismiss();
    /** 显示错误 */
    TextView cellText = (TextView)findViewById(R.id.cellText);
    cellText.setText(e.getMessage());
  }
}

按钮相关的工作就完成了,接下来编写获取基站信息的方法。

三、获取基站信息

获取基站信息我们需要调用SDK提供的API中的TelephonyManager,需要在文件头部引入:

import android.telephony.TelephonyManager;
import android.telephony.gsm.GsmCellLocation;

完整代码为:

/**
 * 获取基站信息
 * 
 * @throws Exception
 */
private SCell getCellInfo() throws Exception {
  SCell cell = new SCell();
 
  /** 调用API获取基站信息 */
  TelephonyManager mTelNet = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
  GsmCellLocation location = (GsmCellLocation) mTelNet.getCellLocation();
  if (location == null)
    throw new Exception("获取基站信息失败");
 
  String operator = mTelNet.getNetworkOperator();
  int mcc = Integer.parseInt(operator.substring(0, 3));
  int mnc = Integer.parseInt(operator.substring(3));
  int cid = location.getCid();
  int lac = location.getLac();
 
  /** 将获得的数据放到结构体中 */
  cell.MCC = mcc;
  cell.MNC = mnc;
  cell.LAC = lac;
  cell.CID = cid;
 
  return cell;
}

如果获得的位置信息为null将抛出错误,不再继续执行。最后将获取的基站信息封装为结构体返回。

四、获取经纬度

在这一步,我们需要采用HTTP调用google的API以获取基站所在的经纬度。

Android作为一款互联网手机,联网的功能必不可少。Android提供了多个接口供我们使用,这里我们使用DefaultHttpClient。

完整的方法代码如下:

/**
 * 获取经纬度
 * 
 * @throws Exception
 */
private SItude getItude(SCell cell) throws Exception {
  SItude itude = new SItude();
 
  /** 采用Android默认的HttpClient */
  HttpClient client = new DefaultHttpClient();
  /** 采用POST方法 */
  HttpPost post = new HttpPost("http://www.google.com/loc/json");
  try {
    /** 构造POST的JSON数据 */
    JSONObject holder = new JSONObject();
    holder.put("version", "1.1.0");
    holder.put("host", "maps.google.com");
    holder.put("address_language", "zh_CN");
    holder.put("request_address", true);
    holder.put("radio_type", "gsm");
    holder.put("carrier", "HTC");
 
    JSONObject tower = new JSONObject();
    tower.put("mobile_country_code", cell.MCC);
    tower.put("mobile_network_code", cell.MNC);
    tower.put("cell_id", cell.CID);
    tower.put("location_area_code", cell.LAC);
 
    JSONArray towerarray = new JSONArray();
    towerarray.put(tower);
    holder.put("cell_towers", towerarray);
 
    StringEntity query = new StringEntity(holder.toString());
    post.setEntity(query);
 
    /** 发出POST数据并获取返回数据 */
    HttpResponse respOnse= client.execute(post);
    HttpEntity entity = response.getEntity();
    BufferedReader buffReader = new BufferedReader(new InputStreamReader(entity.getContent()));
    StringBuffer strBuff = new StringBuffer();
    String result = null;
    while ((result = buffReader.readLine()) != null) {
      strBuff.append(result);
    }
 
    /** 解析返回的JSON数据获得经纬度 */
    JSONObject json = new JSONObject(strBuff.toString());
    JSONObject subjosn = new JSONObject(json.getString("location"));
 
    itude.latitude = subjosn.getString("latitude");
    itude.lOngitude= subjosn.getString("longitude");
     
    Log.i("Itude", itude.latitude + itude.longitude);
     
  } catch (Exception e) {
    Log.e(e.getMessage(), e.toString());
    throw new Exception("获取经纬度出现错误:"+e.getMessage());
  } finally{
    post.abort();
    client = null;
  }
   
  return itude;
}

在这里采用POST方法将JSON数据发送到googleAPI,google返回JSON数据,我们得到数据后解析,得到经纬度信息。

五、获取物理位置

得到经纬度后,我们将之转换为物理地址。

我们仍然使用DefaultHttpClient来调用google地图的API,获得物理信息,不过在这里我们使用GET方法。

完整的方法代码如下:

/**
 * 获取地理位置
 * 
 * @throws Exception
 */
private String getLocation(SItude itude) throws Exception {
  String resultString = "";
 
  /** 这里采用get方法,直接将参数加到URL上 */
  String urlString = String.format("http://maps.google.cn/maps/geo&#63;key=abcdefg&q=%s,%s", itude.latitude, itude.longitude);
  Log.i("URL", urlString);
 
  /** 新建HttpClient */
  HttpClient client = new DefaultHttpClient();
  /** 采用GET方法 */
  HttpGet get = new HttpGet(urlString);
  try {
    /** 发起GET请求并获得返回数据 */
    HttpResponse respOnse= client.execute(get);
    HttpEntity entity = response.getEntity();
    BufferedReader buffReader = new BufferedReader(new InputStreamReader(entity.getContent()));
    StringBuffer strBuff = new StringBuffer();
    String result = null;
    while ((result = buffReader.readLine()) != null) {
      strBuff.append(result);
    }
    resultString = strBuff.toString();
 
    /** 解析JSON数据,获得物理地址 */
    if (resultString != null && resultString.length() > 0) {
      JSONObject jsOnobject= new JSONObject(resultString);
      JSONArray jsOnArray= new JSONArray(jsonobject.get("Placemark").toString());
      resultString = "";
      for (int i = 0; i 

GET方法就比POST方法简单多了,得到的数据同样为JSON格式,解析一下得到物理地址。

六、显示结果

好了,我们已经得到我们想要的信息了,我们把它显示出来,方法代码如下:

/** 显示结果 */
private void showResult(SCell cell, String location) {
  TextView cellText = (TextView) findViewById(R.id.cellText);
  cellText.setText(String.format("基站信息:mcc:%d, mnc:%d, lac:%d, cid:%d",
      cell.MCC, cell.MNC, cell.LAC, cell.CID));
 
  TextView locatiOnText= (TextView) findViewById(R.id.lacationText);
  locationText.setText("物理位置:" + location);
}

七、运行程序

我们的编码工作已经完成了。在上面的代码中有些地方需要的引入代码没有提到,下面把完整的代码贴出来:

package com.android.demo;
 
import java.io.BufferedReader;
import java.io.InputStreamReader;
 
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.DefaultHttpClient;
 
import org.json.JSONArray;
import org.json.JSONObject;
 
import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Context;
import android.os.Bundle;
import android.telephony.TelephonyManager;
import android.telephony.gsm.GsmCellLocation;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.view.View.OnClickListener;
 
public class DemoActivity extends Activity {
  /** Called when the activity is first created. */
  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
 
    /** 为按钮绑定事件 */
    Button btnGetLocation = (Button) findViewById(R.id.button1);
    btnGetLocation.setOnClickListener(new OnClickListener() {
      @Override
      public void onClick(View arg0) {
        // TODO Auto-generated method stub
        onBtnClick();
      }
    });
  }
   
  /** 基站信息结构体 */
  public class SCell{
    public int MCC;
    public int MNC;
    public int LAC;
    public int CID;
  }
   
  /** 经纬度信息结构体 */
  public class SItude{
    public String latitude;
    public String longitude;
  }
   
  /** 按钮点击回调函数 */
  private void onBtnClick() {
    /** 弹出一个等待状态的框 */
    ProgressDialog mProgressDialog = new ProgressDialog(this);
    mProgressDialog.setMessage("正在获取中...");
    mProgressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
    mProgressDialog.show();
 
    try {
      /** 获取基站数据 */
      SCell cell = getCellInfo();
 
      /** 根据基站数据获取经纬度 */
      SItude itude = getItude(cell);
 
      /** 获取地理位置 */
      String location = getLocation(itude);
 
      /** 显示结果 */
      showResult(cell, location);
 
      /** 关闭对话框 */
      mProgressDialog.dismiss();
    } catch (Exception e) {
      /** 关闭对话框 */
      mProgressDialog.dismiss();
      /** 显示错误 */
      TextView cellText = (TextView) findViewById(R.id.cellText);
      cellText.setText(e.getMessage());
      Log.e("Error", e.getMessage());
    }
  }
   
  /**
   * 获取基站信息
   * 
   * @throws Exception
   */
  private SCell getCellInfo() throws Exception {
    SCell cell = new SCell();
 
    /** 调用API获取基站信息 */
    TelephonyManager mTelNet = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
    GsmCellLocation location = (GsmCellLocation) mTelNet.getCellLocation();
    if (location == null)
      throw new Exception("获取基站信息失败");
 
    String operator = mTelNet.getNetworkOperator();
    int mcc = Integer.parseInt(operator.substring(0, 3));
    int mnc = Integer.parseInt(operator.substring(3));
    int cid = location.getCid();
    int lac = location.getLac();
 
    /** 将获得的数据放到结构体中 */
    cell.MCC = mcc;
    cell.MNC = mnc;
    cell.LAC = lac;
    cell.CID = cid;
 
    return cell;
  }
   
  /**
   * 获取经纬度
   * 
   * @throws Exception
   */
  private SItude getItude(SCell cell) throws Exception {
    SItude itude = new SItude();
 
    /** 采用Android默认的HttpClient */
    HttpClient client = new DefaultHttpClient();
    /** 采用POST方法 */
    HttpPost post = new HttpPost("http://www.google.com/loc/json");
    try {
      /** 构造POST的JSON数据 */
      JSONObject holder = new JSONObject();
      holder.put("version", "1.1.0");
      holder.put("host", "maps.google.com");
      holder.put("address_language", "zh_CN");
      holder.put("request_address", true);
      holder.put("radio_type", "gsm");
      holder.put("carrier", "HTC");
 
      JSONObject tower = new JSONObject();
      tower.put("mobile_country_code", cell.MCC);
      tower.put("mobile_network_code", cell.MNC);
      tower.put("cell_id", cell.CID);
      tower.put("location_area_code", cell.LAC);
 
      JSONArray towerarray = new JSONArray();
      towerarray.put(tower);
      holder.put("cell_towers", towerarray);
 
      StringEntity query = new StringEntity(holder.toString());
      post.setEntity(query);
 
      /** 发出POST数据并获取返回数据 */
      HttpResponse respOnse= client.execute(post);
      HttpEntity entity = response.getEntity();
      BufferedReader buffReader = new BufferedReader(new InputStreamReader(entity.getContent()));
      StringBuffer strBuff = new StringBuffer();
      String result = null;
      while ((result = buffReader.readLine()) != null) {
        strBuff.append(result);
      }
 
      /** 解析返回的JSON数据获得经纬度 */
      JSONObject json = new JSONObject(strBuff.toString());
      JSONObject subjosn = new JSONObject(json.getString("location"));
 
      itude.latitude = subjosn.getString("latitude");
      itude.lOngitude= subjosn.getString("longitude");
       
      Log.i("Itude", itude.latitude + itude.longitude);
       
    } catch (Exception e) {
      Log.e(e.getMessage(), e.toString());
      throw new Exception("获取经纬度出现错误:"+e.getMessage());
    } finally{
      post.abort();
      client = null;
    }
     
    return itude;
  }
   
  /**
   * 获取地理位置
   * 
   * @throws Exception
   */
  private String getLocation(SItude itude) throws Exception {
    String resultString = "";
 
    /** 这里采用get方法,直接将参数加到URL上 */
    String urlString = String.format("http://maps.google.cn/maps/geo&#63;key=abcdefg&q=%s,%s", itude.latitude, itude.longitude);
    Log.i("URL", urlString);
 
    /** 新建HttpClient */
    HttpClient client = new DefaultHttpClient();
    /** 采用GET方法 */
    HttpGet get = new HttpGet(urlString);
    try {
      /** 发起GET请求并获得返回数据 */
      HttpResponse respOnse= client.execute(get);
      HttpEntity entity = response.getEntity();
      BufferedReader buffReader = new BufferedReader(new InputStreamReader(entity.getContent()));
      StringBuffer strBuff = new StringBuffer();
      String result = null;
      while ((result = buffReader.readLine()) != null) {
        strBuff.append(result);
      }
      resultString = strBuff.toString();
 
      /** 解析JSON数据,获得物理地址 */
      if (resultString != null && resultString.length() > 0) {
        JSONObject jsOnobject= new JSONObject(resultString);
        JSONArray jsOnArray= new JSONArray(jsonobject.get("Placemark").toString());
        resultString = "";
        for (int i = 0; i 

我们连上手机在手机上运行程序看看。

不出意外的话程序运行起来了,自动跳转到了主界面。点击“Click Me”,出错了!

详细的错误信息为:Neither user 10078 nor current process has android.permission.ACCESS_COARSE_LOCATION.

原来是没有权限,经过前面的学习,我们知道Android在应用的安全上下了一番功夫,要用一些特殊功能必须先报告,安装应用的时候列给用户看,必须要得到用户的允许。这里我们用了获取基站信息的功能,涉及到用户的隐私了,所以我们必须申明一下。

打开AndroidManifest.xml配置文件,在里面添加相应的配置信息:

我们继续把网络连接的权限申明也加上:

再编译运行看看(点击“Click Me”后程序会卡住,等待一段时间才有反应,取决于网络情况):

成功啦!

可能有的同学还是出现错误,没有成功:

█ 提示“www.google.com…”什么的错误

请确认你的手机能访问互联网,调用google的API是必须联网的。

█ 提示获取不到基站信息

你确定你是在手机上测试的吗?模拟器可不行哦。或者你的手机使用的CMDA网络?这个例子只支持GSM网络…

█ 获取不到经纬度

很有可能你中奖了,你所在的基站还没纳入google的数据库…(话说我之前也遇到过,怎么查就是查不出经纬度来,返回数据为空)

█ 获取到的地理地址不正确

这个可能程序出错了,可能google出错了?

其实google map API返回的数据中还包含了很多其他信息,我们可以用来开发一些更有趣的功能,如制作我们专属的地图软件、足迹记录软件等,充分发挥你的创造力:)

八、总结

这个程序基本实现了基站定位功能,但还有很多问题,如:点击了按钮后界面会卡住(访问网络时阻塞了进程)、未对异常进一步处理、不兼容CMDA网络等。

另外这个程序的精度也不够,获得的位置实际上是基站的物理位置,与人所在的位置还有一定差距。在城市里面,一般采用密集型的小功率基站,精度一般在几百米范围内,而在郊区常为大功率基站,密度很小,精度一般在几千米以上。

想要取得更高的精度需要通过一些其他的算法来实现,如果大家有兴趣的话我们可以一起来研究一下,再专门写篇笔记。

可见写一段程序和做一个实际的产品是有很大差别的。

结尾
这一节基本实现了最简单的基站定位,只是作为学习的例子,远远达不到产品的要求,请大家见谅。

我们进一步熟悉了JAVA编码,之前没怎么接触JAVA看起来有点吃力的同学建议找点JAVA基础的书来看看。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


推荐阅读
  • Android系统移植与调试之如何修改Android设备状态条上音量加减键在横竖屏切换的时候的显示于隐藏
    本文介绍了如何修改Android设备状态条上音量加减键在横竖屏切换时的显示与隐藏。通过修改系统文件system_bar.xml实现了该功能,并分享了解决思路和经验。 ... [详细]
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • 一、Hadoop来历Hadoop的思想来源于Google在做搜索引擎的时候出现一个很大的问题就是这么多网页我如何才能以最快的速度来搜索到,由于这个问题Google发明 ... [详细]
  • 学习SLAM的女生,很酷
    本文介绍了学习SLAM的女生的故事,她们选择SLAM作为研究方向,面临各种学习挑战,但坚持不懈,最终获得成功。文章鼓励未来想走科研道路的女生勇敢追求自己的梦想,同时提到了一位正在英国攻读硕士学位的女生与SLAM结缘的经历。 ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • [译]技术公司十年经验的职场生涯回顾
    本文是一位在技术公司工作十年的职场人士对自己职业生涯的总结回顾。她的职业规划与众不同,令人深思又有趣。其中涉及到的内容有机器学习、创新创业以及引用了女性主义者在TED演讲中的部分讲义。文章表达了对职业生涯的愿望和希望,认为人类有能力不断改善自己。 ... [详细]
  • 本文介绍了在Win10上安装WinPythonHadoop的详细步骤,包括安装Python环境、安装JDK8、安装pyspark、安装Hadoop和Spark、设置环境变量、下载winutils.exe等。同时提醒注意Hadoop版本与pyspark版本的一致性,并建议重启电脑以确保安装成功。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • Google Play推出全新的应用内评价API,帮助开发者获取更多优质用户反馈。用户每天在Google Play上发表数百万条评论,这有助于开发者了解用户喜好和改进需求。开发者可以选择在适当的时间请求用户撰写评论,以获得全面而有用的反馈。全新应用内评价功能让用户无需返回应用详情页面即可发表评论,提升用户体验。 ... [详细]
  • 拥抱Android Design Support Library新变化(导航视图、悬浮ActionBar)
    转载请注明明桑AndroidAndroid5.0Loollipop作为Android最重要的版本之一,为我们带来了全新的界面风格和设计语言。看起来很受欢迎࿰ ... [详细]
  • Android开发实现的计时器功能示例
    本文分享了Android开发实现的计时器功能示例,包括效果图、布局和按钮的使用。通过使用Chronometer控件,可以实现计时器功能。该示例适用于Android平台,供开发者参考。 ... [详细]
  • Go语言实现堆排序的详细教程
    本文主要介绍了Go语言实现堆排序的详细教程,包括大根堆的定义和完全二叉树的概念。通过图解和算法描述,详细介绍了堆排序的实现过程。堆排序是一种效率很高的排序算法,时间复杂度为O(nlgn)。阅读本文大约需要15分钟。 ... [详细]
  • 本文介绍了前端人员必须知道的三个问题,即前端都做哪些事、前端都需要哪些技术,以及前端的发展阶段。初级阶段包括HTML、CSS、JavaScript和jQuery的基础知识。进阶阶段涵盖了面向对象编程、响应式设计、Ajax、HTML5等新兴技术。高级阶段包括架构基础、模块化开发、预编译和前沿规范等内容。此外,还介绍了一些后端服务,如Node.js。 ... [详细]
  • 本文介绍了如何使用JSONObiect和Gson相关方法实现json数据与kotlin对象的相互转换。首先解释了JSON的概念和数据格式,然后详细介绍了相关API,包括JSONObject和Gson的使用方法。接着讲解了如何将json格式的字符串转换为kotlin对象或List,以及如何将kotlin对象转换为json字符串。最后提到了使用Map封装json对象的特殊情况。文章还对JSON和XML进行了比较,指出了JSON的优势和缺点。 ... [详细]
author-avatar
i1L3i1L4
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有