如何在 BlackBerry 5.0 及更高版本的 J2ME 代码中使用 wifi 调用 HTTP URL?

Posted

技术标签:

【中文标题】如何在 BlackBerry 5.0 及更高版本的 J2ME 代码中使用 wifi 调用 HTTP URL?【英文标题】:How to call HTTP URL using wifi in J2ME code for BlackBerry 5.0 and above? 【发布时间】:2013-08-10 10:52:19 【问题描述】:

我正在使用 J2ME 代码从 BlackBerry 调用 Web 服务。当我尝试使用HttpConnection 打开连接时,它只检查 GPRS 连接。现在,我想检查 Wi-Fi 连接并通过 Wi-Fi 调用 Web 服务。

以下代码是我的连接部分。如何更改 Wi-Fi 连接的代码?

public boolean HttpUrl() 

    HttpConnection conn = null;
    OutputStream out = null;
    String url = "http://www.google.com";
    try 
    
        conn = (HttpConnection) new ConnectionFactory().getConnection(url).getConnection();
        if (conn != null) 
        

            conn.setRequestMethod(HttpConnection.POST);
            conn.setRequestProperty("Content-Length", "application/x-www-form-urlencoded");
            conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
            conn.setRequestProperty("User-Agent", "Profile/MIDP-2.0 Configuration/CLDC-1.0");


        
     
    catch (Exception e) 
    
        return false;
     
    finally 
    
        try 
        
            out.close();
         
        catch (Exception e2) 
        
        
    

    //Only if exception occurs, we close the connection.
    //Otherwise the caller should close the connection himself.
    try 
    
        conn.close();
     
    catch (Exception e1)
    
    
    return true;

【问题讨论】:

【参考方案1】:

这样检查:

HttpConnection conn = null;
String URL = "http://www.myServer.com/myContent;deviceside=true;interface=wifi";
conn = (HttpConnection)Connector.open(URL);

source

【讨论】:

据我了解,BlackBerry 的建议是仅编码“;interface=wifi”。有人告诉我添加“;deviceside=true”不是必需的,可能会混淆连接选择逻辑。也就是说,内特的回答也是我推荐的方法。【参考方案2】:

建立联系

Rafael's answer will certainly work 如果您知道您将使用 Wi-Fi。

但是,如果您只需要支持 BlackBerry OS 5.0 - 7.1,我建议您使用ConnectionFactory通常,您不会将代码限制为仅使用一个传输。 You'll normally support (almost) any transport the device has,但您可能希望对您的应用程序进行编码以首先选择某些传输方式。

例如,

class ConnectionThread extends Thread

    public void run()
    
        ConnectionFactory connFact = new ConnectionFactory();
        connFact.setPreferredTransportTypes(new int[]  
                TransportInfo.TRANSPORT_TCP_WIFI,
                TransportInfo.TRANSPORT_BIS_B,
                TransportInfo.TRANSPORT_MDS,
                TransportInfo.TRANSPORT_TCP_CELLULAR
        );
        ConnectionDescriptor connDesc;
        connDesc = connFact.getConnection("http://www.google.com");
        if (connDesc != null)
        
            HttpConnection httpConn;
            httpConn = (HttpConnection)connDesc.getConnection();
            try
            
                // TODO: set httpConn request method and properties here!
                final int iResponseCode = httpConn.getResponseCode();
                UiApplication.getUiApplication().invokeLater(new Runnable()
                
                    public void run()
                    
                        Dialog.alert("Response code: " + 
                                Integer.toString(iResponseCode));
                    
                );
             
            catch (IOException e) 
            
                System.err.println("Caught IOException: " 
                        + e.getMessage());
            
        
    
    

如果 Wi-Fi 可用,将选择 Wi-Fi 传输,但如果不可用,则使用 GPRS 连接。我认为对于 5.0+ 设备,这通常被认为是 best practice。

请求属性

这段代码

conn.setRequestProperty("Content-Length", "application/x-www-form-urlencoded");

不对。 Content-Length 应该是您的 HTTP POST 参数的大小(以字节为单位)。 See an example here.

线程

请记住,建立网络连接很慢。不要通过在主/UI 线程上运行此代码来阻塞用户界面。将您的代码放入后台线程,以在您请求远程内容时保持 UI 响应。

【讨论】:

以上是关于如何在 BlackBerry 5.0 及更高版本的 J2ME 代码中使用 wifi 调用 HTTP URL?的主要内容,如果未能解决你的问题,请参考以下文章

Android BLE write Characteristic 方法在 Android 5.0 及更高版本中总是返回 false

PubNub GCM通知无法在Android 5.0及更高版本上运行

缺少架构。使用 Watch OS 5.0 及更高版本 SDK 构建的应用程序必须包含其他架构

请为 Windows Mobile 5.0 及更高版本安装“NETCFv35.Messages.EN.wm.cab”或为其他平台安装“NETCFv35.Messages.EN.cab”。重启a

如何创建一个向后兼容iOS 5.0的新Xcode 5项目? - 错过故事板错误

如何在 android 2.3 及更高版本中获取当前启动器的包名?