Java Can';t在Android中将单元格ID和Lac转换为纬度和经度
我正在尝试获取我的应用程序中的所有用户手机和位置信息,并将它们显示在一些文本视图中。我得到的所有信息都是正确的,但它并没有返回纬度和经度。它显示“找不到位置”。我检查了它,发现我的“httpConn.Connect()”语句正在引发异常。我不知道为什么它会抛出异常。我已授予所需的所有权限。我该怎么办 这是我的密码:Java Can';t在Android中将单元格ID和Lac转换为纬度和经度,java,android,google-maps,Java,Android,Google Maps,我正在尝试获取我的应用程序中的所有用户手机和位置信息,并将它们显示在一些文本视图中。我得到的所有信息都是正确的,但它并没有返回纬度和经度。它显示“找不到位置”。我检查了它,发现我的“httpConn.Connect()”语句正在引发异常。我不知道为什么它会抛出异常。我已授予所需的所有权限。我该怎么办 这是我的密码: public class CellActivity extends AppCompatActivity { private static String TAG = CellActi
public class CellActivity extends AppCompatActivity {
private static String TAG = CellActivity.class.getSimpleName();
int myLatitude,myLongitude;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_cell);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
TelephonyManager telephonyManager=(TelephonyManager) this.getSystemService(this.TELEPHONY_SERVICE);
String serialNum=telephonyManager.getSimSerialNumber();
String deviceId=telephonyManager.getDeviceId();
GsmCellLocation location=(GsmCellLocation) telephonyManager.getCellLocation();
int cid=location.getCid();
int lac=location.getLac();
String networkOperator = telephonyManager.getNetworkOperator();
int mcc = Integer.parseInt(networkOperator.substring(0, 3));
int mnc = Integer.parseInt(networkOperator.substring(3));
String oName=telephonyManager.getNetworkOperatorName();
TextView sim=(TextView) findViewById(R.id.sim);
TextView deviceID=(TextView) findViewById(R.id.deviceId);
TextView cellId=(TextView) findViewById(R.id.cellId);
TextView mccb=(TextView) findViewById(R.id.mcc);
TextView mncb=(TextView) findViewById(R.id.mnc);
TextView operator=(TextView) findViewById(R.id.operator);
TextView lacb=(TextView) findViewById(R.id.lac);
TextView operatorName=(TextView) findViewById(R.id.operatorName);
TextView position=(TextView) findViewById(R.id.position);
sim.setText("serial no. : "+serialNum);
deviceID.setText("device id : "+deviceId);
cellId.setText("cid : "+cid);
mccb.setText("mcc : "+mcc);
mncb.setText("mnc : "+mnc);
operator.setText("operator : "+networkOperator);
lacb.setText("lac : "+lac);
operatorName.setText(oName);
if(RqsLocation(cid, lac)){
position.setText(
String.valueOf((float)myLatitude/1000000)
+ " : "
+ String.valueOf((float)myLongitude/1000000));
}else{
position.setText("Can't find Location!");
}
}
private Boolean RqsLocation(final int cid,final int lac){
Boolean result = false;
final String urlmmap = "http://www.google.com/glm/mmap";
try {
URL url = new URL(urlmmap);
URLConnection conn = url.openConnection();
HttpURLConnection httpConn = (HttpURLConnection) conn;
httpConn.setRequestMethod("POST");
httpConn.setDoOutput(true);
httpConn.setDoInput(true);
try {
httpConn.connect();
}catch(Exception e)
{
e.printStackTrace();
}
OutputStream outputStream = httpConn.getOutputStream();
WriteData(outputStream, cid, lac);
InputStream inputStream = httpConn.getInputStream();
DataInputStream dataInputStream = new DataInputStream(inputStream);
dataInputStream.readShort();
dataInputStream.readByte();
int code = dataInputStream.readInt();
if (code == 0) {
myLatitude = dataInputStream.readInt();
myLongitude = dataInputStream.readInt();
result = true;
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return result;
}
private void WriteData(OutputStream out, int cid, int lac)
throws IOException
{
DataOutputStream dataOutputStream = new DataOutputStream(out);
dataOutputStream.writeShort(21);
dataOutputStream.writeLong(0);
dataOutputStream.writeUTF("en");
dataOutputStream.writeUTF("Android");
dataOutputStream.writeUTF("1.0");
dataOutputStream.writeUTF("Web");
dataOutputStream.writeByte(27);
dataOutputStream.writeInt(0);
dataOutputStream.writeInt(0);
dataOutputStream.writeInt(3);
dataOutputStream.writeUTF("");
dataOutputStream.writeInt(cid);
dataOutputStream.writeInt(lac);
dataOutputStream.writeInt(0);
dataOutputStream.writeInt(0);
dataOutputStream.writeInt(0);
dataOutputStream.writeInt(0);
dataOutputStream.flush();
}
}
这是我的舱单:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.sachinparashar.celldemo">
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity
android:name=".CellActivity"
android:label="@string/app_name"
android:theme="@style/AppTheme.NoActionBar">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
看起来您正试图在UI线程上发出网络请求-我猜这是您看到的异常。尝试使用AsyncTask或类似工具将RqsLocation调用移动到后台线程。即使我也有同样的问题,但我有异常“java.io.IOException:不允许到www.google.com的明文HTTP流量””
如果使用Android 9 Pie,则必须在清单应用程序中设置networkSecurityConfig
<?xml version="1.0" encoding="utf-8"?>
<manifest ... >
<application android:networkSecurityConfig="@xml/network_security_config">
</application>
</manifest>
在res/xml/network\u security\u config.xml内创建文件并添加以下代码
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<base-config cleartextTrafficPermitted="true">
<trust-anchors>
<certificates src="system" />
</trust-anchors>
</base-config>
</network-security-config>
什么是异常?请在logcat中提供错误消息