无法使用opencellid.org Android

时间:2015-05-16 10:03:07

标签: android android-asynctask android-networking

即时通讯使用opencellid.org从Cell ID和Mnc以及Mmcc等信息获取Mobile的位置,我能够获得CellId,MNC,MCC和LAC但无法从这些信息中获取位置错误显示“ android.os.NetworkOnMainThreadException

这是代码

public class OpenCellID {
		  String mcc;  //Mobile Country Code
		  String mnc;  //mobile network code
		  String cellid; //Cell ID
		  String lac;  //Location Area Code
		   
		  Boolean error;
		  String strURLSent;;
		  String GetOpenCellID_fullresult;;
		   
		  String latitude;
		  String longitude;
		   
		  public Boolean isError(){
		   return error;
		  }
		   
		  public void setMcc(String value){
		   mcc = value;
		  }
		   
		  public void setMnc(String value){
		   mnc = value;
		  }
		   
		  public void setCallID(int value){
		   cellid = String.valueOf(value);
		  }
		   
		  public void setCallLac(int value){
		   lac = String.valueOf(value);
		  }
		   
		  public String getLocation(){
		   return(latitude + " : " + longitude);
		  }
		   
		  public void groupURLSent(){
		   strURLSent =
		    "http://www.opencellid.org/cell/get?mcc=" + mcc
		    +"&mnc=" + mnc
		    +"&cellid=" + cellid
		    +"&lac=" + lac
		    +"&fmt=txt";
		  }
		   
		  public String getstrURLSent(){
		   return strURLSent;
		  }
		   
		  public String getGetOpenCellID_fullresult(){
		   return GetOpenCellID_fullresult;
		  }
		   
		  public void GetOpenCellID() throws Exception {
		   groupURLSent();
		   HttpClient client = new DefaultHttpClient();
		   HttpGet request = new HttpGet(strURLSent);
		   HttpResponse response = client.execute(request);
		   GetOpenCellID_fullresult = EntityUtils.toString(response.getEntity()); 
		   spliteResult();
		  }
		   
		  private void spliteResult(){
		   if(GetOpenCellID_fullresult.equalsIgnoreCase("err")){
		    error = true;
		   }else{
		    error = false;
		    String[] tResult = GetOpenCellID_fullresult.split(",");
		    latitude = tResult[0];
		    longitude = tResult[1];
		   }
		     
		    
		  }
		 }
		 
		 int myLatitude, myLongitude;
		 OpenCellID openCellID;
		 
		  
		   /** Called when the activity is first created. */
		   @Override
		   public void onCreate(Bundle savedInstanceState) {
		       super.onCreate(savedInstanceState);
		       setContentView(R.layout.activity_main);
		        
		       TextView textGsmCellLocation = (TextView)findViewById(R.id.gsmcelllocation);
		       TextView textMCC = (TextView)findViewById(R.id.mcc);
		       TextView textMNC = (TextView)findViewById(R.id.mnc);
		       TextView textCID = (TextView)findViewById(R.id.cid);
		       TextView textLAC = (TextView)findViewById(R.id.lac);
		       TextView textGeo = (TextView)findViewById(R.id.geo);
		       TextView textRemark = (TextView)findViewById(R.id.remark);;
		       
		       
		       //retrieve a reference to an instance of TelephonyManager
		       TelephonyManager telephonyManager = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);
		       GsmCellLocation cellLocation = (GsmCellLocation)telephonyManager.getCellLocation();
		       
		       String networkOperator = telephonyManager.getNetworkOperator();
		       String mcc = networkOperator.substring(0, 3);
		       String mnc = networkOperator.substring(3);
		       textMCC.setText("mcc: " + mcc);
		       textMNC.setText("mnc: " + mnc);
		       
		       int cid = cellLocation.getCid();
		       int lac = cellLocation.getLac();
		       textGsmCellLocation.setText(cellLocation.toString());
		       textCID.setText("gsm cell id: " + String.valueOf(cid));
		       textLAC.setText("gsm location area code: " + String.valueOf(lac));
		       
		       openCellID = new OpenCellID();
		       
		       openCellID.setMcc(mcc);
		       openCellID.setMnc(mnc);
		       openCellID.setCallID(cid);
		       openCellID.setCallLac(lac);
		       try {
		   openCellID.GetOpenCellID();
		    
		   if(!openCellID.isError()){
		    textGeo.setText(openCellID.getLocation());
		    textRemark.setText( "\n\n"
		      + "URL sent: \n" + openCellID.getstrURLSent() + "\n\n"
		      + "response: \n" + openCellID.GetOpenCellID_fullresult);
		   }else{
		    textGeo.setText("Error");
		   }
		  } catch (Exception e) {
		   // TODO Auto-generated catch block
		   e.printStackTrace();
		   textGeo.setText("Exception: " + e.toString());
		   Log.d("location is not valid",e.toString());
		  }
		   }   
		}

	

记录猫没有显示错误

  : Flushing caches (mode 0)
   received file descriptor 48 from ADB
 D/ActivityThread(27520): BIND_APPLICATION handled : 0 / AppBindData{appInfo=ApplicationInfo{4180ddd8 com.example.cellid_areacode}}
   processIncoming
   processIncoming
   handlePacket : cmd=0x1, cmdSet=0xC7, len=0x13, id=0x4000010A, flags=0x0, dataLen=0x8
   REQ: DDM.Chunk (cmd=199/1 dataLen=8 id=0x4000010a)
   reply: dataLen=9 err=NONE(0)
   processIncoming
   handlePacket : cmd=0x1, cmdSet=0xC7, len=0x17, id=0x4000010B, flags=0x0, dataLen=0xC
   REQ: DDM.Chunk (cmd=199/1 dataLen=12 id=0x4000010b)
   reply: dataLen=104 err=NONE(0)
   processIncoming
   handlePacket : cmd=0x1, cmdSet=0xC7, len=0x13, id=0x4000010C, flags=0x0, dataLen=0x8
   REQ: DDM.Chunk (cmd=199/1 dataLen=8 id=0x4000010c)
   reply: dataLen=216 err=NONE(0)
   processIncoming
   handlePacket : cmd=0x1, cmdSet=0xC7, len=0x13, id=0x4000010D, flags=0x0, dataLen=0x8
   REQ: DDM.Chunk (cmd=199/1 dataLen=8 id=0x4000010d)
   reply: dataLen=9 err=NONE(0)
   processIncoming
   handlePacket : cmd=0x1, cmdSet=0xC7, len=0x14, id=0x4000010E, flags=0x0, dataLen=0x9
   REQ: DDM.Chunk (cmd=199/1 dataLen=9 id=0x4000010e)
   reply: dataLen=0 err=NONE(0)
 getDefaultSim is sim1
  create GsmCellLocation
  getDefaultSim is sim1
  getaddrinfo: www.opencellid.org  return error = 0x8 >>
   android.os.NetworkOnMainThreadException
   	at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1099)
   	at java.net.InetAddress.lookupHostByName(InetAddress.java:392)
   	at java.net.InetAddress.getAllByNameImpl(InetAddress.java:243)
   	at java.net.InetAddress.getAllByName(InetAddress.java:221)
   	at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:137)
   	at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164)
   	at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119)
   	at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:363)
   	at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555)
   	at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487)
   	at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465)
   	at com.example.cellid_areacode.MainActivity$OpenCellID.GetOpenCellID(MainActivity.java:80)
   	at com.example.cellid_areacode.MainActivity.onCreate(MainActivity.java:141)
   	at android.app.Activity.performCreate(Activity.java:4479)
   	at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1050)
   	at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2041)
   	at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2104)
   	at android.app.ActivityThread.access$600(ActivityThread.java:134)
   	at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1247)
   	at android.os.Handler.dispatchMessage(Handler.java:99)
   	at android.os.Looper.loop(Looper.java:154)
   	at android.app.ActivityThread.main(ActivityThread.java:4624)
   	at java.lang.reflect.Method.invokeNative(Native Method)
   	at java.lang.reflect.Method.invoke(Method.java:511)
   	at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:809)
   	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:576)
   	at dalvik.system.NativeStart.main(Native Method)
    location is not valid(27520): android.os.NetworkOnMainThreadException
    ActivityThread(27520): ACT-AM_ON_RESUME_CALLED ActivityRecord{4180f378 token=android.os.BinderProxy@4180eb00 {com.example.cellid_areacode/com.example.cellid_areacode.MainActivity}}
    ACT-LAUNCH_ACTIVITY handled : 0 / ActivityRecord{4180f378 token=android.os.BinderProxy@4180eb00 {com.example.cellid_areacode/com.example.cellid_areacode.MainActivity}}
    GC_CONCURRENT freed 194K, 4% free 9425K/9719K, paused 1ms+1ms
    loaded /system/lib/egl/libGLES_android.so
    loaded /vendor/lib/egl/libEGL_mtk.so
    loaded /vendor/lib/egl/libGLESv1_CM_mtk.so
    loaded /vendor/lib/egl/libGLESv2_mtk.so
    Enabling debug mode 0
    threadid=11: interp stack at 0x4d174000
    showStatusIcon on inactive InputConnection
  

如果我没有错,我必须编写AsyncTask类,但我不应该在AsyncTask类中的DoinBackground函数中编写哪个函数或代码。 帮助将不胜感激 在此先感谢

1 个答案:

答案 0 :(得分:1)

我的异步任务课程如下

public class MainActivity extends AppCompatActivity {
private  OpenCellID openCellID;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        TelephonyManager tm = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);
        GsmCellLocation loc = (GsmCellLocation) tm.getCellLocation();
        String networkOperator = tm.getNetworkOperator();
        String mcc = networkOperator.substring(0, 3);
        String mnc = networkOperator.substring(3);
        int cellid = loc.getCid();
        int lac = loc.getLac();
        openCellID = new OpenCellID();
        openCellID.setMcc(mcc);
        openCellID.setMnc(mnc);
        openCellID.setCallID(cellid);
        openCellID.setCallLac(lac);
        new GetLocation().execute();
    }
    class GetLocation extends AsyncTask<String, Void, Void> {
        private Exception exception;
        protected Void doInBackground(String... urls) {
            try {
                try {
                    openCellID.GetOpenCellID();
                    if(!openCellID.isError()) {
                        Toast.makeText(getApplicationContext(), openCellID.getLocation(), Toast.LENGTH_LONG).show();
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
                return null;
            } catch (Exception e) {
                this.exception = e;
                return null;
            }
        }
        protected void onPostExecute(Void feed) {
            // TODO: check this.exception
            // TODO: do something with the feed
        }
    }
    public class OpenCellID {
        String mcc; //Mobile Country Code
        String mnc; //mobile network code
        String cellid; //Cell ID
        String lac; //Location Area Code
        Boolean error;
        String strURLSent;
        String GetOpenCellID_fullresult;
        String latitude;
        String longitude;

        public Boolean isError(){
            return error;
        }

        public void setMcc(String value){
            mcc = value;
        }

        public void setMnc(String value){
            mnc = value;
        }

        public void setCallID(int value){
            cellid = String.valueOf(value);
        }

        public void setCallLac(int value){
            lac = String.valueOf(value);
        }

        public String getLocation(){
            return(latitude + " : " + longitude);
        }
        public void groupURLSent(){
            strURLSent =
                    "http://www.opencellid.org/cell/get?key=15e7c7be-4d6c-42bc-a79c-23be75abcc87&mcc=" + mcc
                            +"&mnc=" + mnc
                            +"&cellid=" + cellid
                            +"&lac=" + lac
                            +"&fmt=txt";
        }

        public String getstrURLSent(){
            return strURLSent;
        }

        public String getGetOpenCellID_fullresult(){
            return GetOpenCellID_fullresult;
        }

        public void GetOpenCellID() throws Exception {
            groupURLSent();
            HttpClient client = new DefaultHttpClient();
            HttpGet request = new HttpGet(strURLSent);
            HttpResponse response = client.execute(request);
            GetOpenCellID_fullresult = EntityUtils.toString(response.getEntity());
            spliteResult();
        }
        private void spliteResult(){
            if(GetOpenCellID_fullresult.equalsIgnoreCase("err")){
                error = true;
            }else{
                error = false;
                String[] tResult = GetOpenCellID_fullresult.split(",");
                latitude = "23.028431";
                longitude = "72.491422";
            }
        }
    }
}

还有一个建议是在您的网址中添加api密钥,否则它不会给您带来结果。

您可以从this链接

创建API密钥

你的网址必须是这样的 http://opencellid.org/cell/get?key=15e7c7be-4d6c-42bc-a79c-23be75abcc87&mcc=405&mnc=030&cellid=19757464&lac=30001&fmt=txt