4

我已经从 GPS 获得了 OS 5 及更高版本的地理位置。

我需要从网络获取地理位置。如果 GPS 被禁用,我需要为 OS 5 从网络收集地理位置信息。

我检查了这个 BlackBerry 文档

他们为 OS 6 及更高版本提供了解决方案。

我们可以在没有 GPS 的情况下为 blackberry OS 5 获得地理定位吗?

4

2 回答 2

2

试试这个 -

try {

    int cellID = GPRSInfo.getCellInfo().getCellId();
    int lac = GPRSInfo.getCellInfo().getLAC();

    String urlString2 = "http://www.google.com/glm/mmap";
    if ((WLANInfo.getWLANState() == WLANInfo.WLAN_STATE_CONNECTED)
            && RadioInfo
                    .areWAFsSupported(RadioInfo.WAF_WLAN)) {
        urlString2 += ";interface=wifi;ConnectionTimeout=60000";
    }else  if (TransportInfo.isTransportTypeAvailable(TransportInfo.TRANSPORT_BIS_B) && TransportInfo.hasSufficientCoverage(TransportInfo.TRANSPORT_BIS_B)) {
        System.out.println("BIS CONNECTION-------------------");
        // Holder.connectionInterface=";deviceside=false;ConnectionType=mds-public";
        urlString2 += ";deviceside=false;ConnectionType=mds-public;ConnectionTimeout=60000";
    } 


    // Open a connection to Google Maps API 
    ConnectionFactory connFact = new ConnectionFactory();
    ConnectionDescriptor connDesc;
    connDesc = connFact.getConnection(urlString2);

    HttpConnection httpConn2;
    httpConn2 = (HttpConnection)connDesc.getConnection();
    httpConn2.setRequestMethod("POST");

    // Write some custom data to Google Maps API 
    OutputStream outputStream2 = httpConn2.openOutputStream();//getOutputStream();
    WriteDataGoogleMaps(outputStream2, cellID, lac);

    // Get the response  
    InputStream inputStream2 = httpConn2.openInputStream();//getInputStream();
    DataInputStream dataInputStream2 = new DataInputStream(inputStream2);

    // Interpret the response obtained 
    dataInputStream2.readShort();
    dataInputStream2.readByte();

    int code = dataInputStream2.readInt();
    //Dialog.alert(code+"");

    if (code == 0) {
        latitude= dataInputStream2.readInt() / 1000000D;
        longitude=dataInputStream2.readInt() / 1000000D;

        //Dialog.alert(latitude+"-----"+longitude);  

        dataInputStream2.readInt();
        dataInputStream2.readInt();
        dataInputStream2.readUTF();

    } else {
        System.out.println("Error obtaining Cell Id ");
    }
    outputStream2.close();
    inputStream2.close();
} catch (Exception e) {
    System.out.println("Error: " + e.getMessage());
}

WriteDataGoogleMaps() 方法 -

private static void WriteDataGoogleMaps(OutputStream out, int cellID, 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(cellID);
    dataOutputStream.writeInt(lac);
    dataOutputStream.writeInt(0);
    dataOutputStream.writeInt(0);
    dataOutputStream.writeInt(0);
    dataOutputStream.writeInt(0);
    dataOutputStream.flush();
}
于 2013-06-19T06:17:47.670 回答
1

除了@Signare 的回答之外,您的另一个选择是使用适用于 OS 5.0 及更高版本的Simple Location API 。

从 github 下载源代码并将其包含在您的项目中。

然后,要在不使用 GPS 的情况下获取定位信息,请尝试以下操作:

 try {
    simpleProvider = new SimpleLocationProvider(SimpleLocationProvider.MODE_GEOLOCATION);
 } catch(LocationException le){ 
    // thrown if the selected mode (in this case MODE_GEOLOCATION) is not available.
 }
 BlackBerryLocation location = simpleProvider.getLocation(120); // 120 seconds timeout

如果您希望在指定的时间间隔使用位置数据回调您的代码,也可以使用SimpleLocationListener接口。

在 OS 6.0 中,此 API 添加了专门选择蜂窝网络作为位置提供商或使用 Wi-Fi 网络的功能。在 OS 5.0 中,您只能选择以下三个选项:

MODE_GEOLOCATION - 在地理定位模式下严格操作。
MODE_GPS - 在 GPS(又名独立/自主)模式下严格运行。
MODE_OPTIMAL - 根据可用性在地理位置和 GPS 模式下运行。

但是,使用MODE_GEOLOCATIONorMODE_OPTIMAL将允许您在不使用 GPS 芯片的情况下获得位置修复。

于 2013-06-20T00:56:00.380 回答