隨筆-348  評論-598  文章-0  trackbacks-0

          OPHONE聯網詳解

          在移動游戲基地調試了2天,終于明白了OPHONE聯網是咋回事了,不敢獨享,貼出來給后來的朋友們。   


          先從OPHONE的聯網機制開始說起。 


          OPHONE聯網,具體分兩步, 第一步是啟動聯網,就跟普通手機啟動GPRS一樣,只是OPHONE改成了程序可以控制啟動和關閉,GPRS則是系統根據程序需求自動連接的。 


          進入OPHONE系統,設置-》數據連接,  就能看到一個選擇框,“開機時連接”, 如果這個已經鉤上,則表明,第一步系統已經給你做了,只是默認連接時CMNET, 我測試的MOTO MT710是這樣的。  如果這個鉤沒有鉤上,則需要你的聯網應用在程序內啟動數據連接。 具體的代碼如下: 


          啟動數據連接       注意下面的參數  networkmode, 這個就是你在OPHONE數據連接設置里看到的,比如internet, cms,wap,等等,你自己建的也可以,根據名字來就行 

          public boolean ActiveNetWorkByMode(String networkmode) { 

                  try 
                  { 
                      Context context = getApplicationContext(); 

                      ConnectivityManager connectivity = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); 

                      connectivity.startUsingNetworkFeature(ConnectivityManager.TYPE_MOBILE, networkmode); 
                      
                      return isNetworkCMWAPAvailable(); 
                      
                  } 
                  catch(Exception e) 
                  { 
                      
                  } 
                  return false; 
                    

              } 
              

          //關閉數據連接 
              public boolean DestroyNetWorkByMode(String networkmode) { 

                  try 
                  { 
                      Context context = getApplicationContext(); 

                      ConnectivityManager connectivity = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); 

                      connectivity.stopUsingNetworkFeature(ConnectivityManager.TYPE_MOBILE, networkmode); 
                      
                      return isNetworkCMWAPAvailable(); 
                      
                  } 
                  catch(Exception e) 
                  { 
                      
                  } 
                  return false; 
                    

              } 



          //判斷數據連接是否激活,如果激活則進一步判斷是不是CMWAP連接,我的聯網只用CMWAP,你可以根據自己的需要具體去改寫。 

          public boolean isNetworkCMWAPAvailable() { 

                     Context context = getApplicationContext(); 

                     ConnectivityManager connectivity = (ConnectivityManager) context 

                     .getSystemService(Context.CONNECTIVITY_SERVICE); 
                    
                     //System.out.println("NETWORK active connectivity     "); 

                     if (connectivity != null) { 

                       NetworkInfo[] info = connectivity.getAllNetworkInfo(); 

                       if (info != null) { 
                           //System.out.println("NETWORK active info is well     "); 
                         for (int i = 0; i < info.length; i++) { 
                           String typeName = info.getTypeName(); 
                           String extraInfo = info.getExtraInfo(); 
                            
                           //System.out.println("NETWORK active info state      "  + info.getState() + "   "  + typeName + "   " + extraInfo); 
                           if (info.getState() == NetworkInfo.State.CONNECTED) { 
                                
                               //System.out.println("NETWORK CONNECTED     " + extraInfo); 
                                      String subType = info.getSubtypeName(); 
                                      if ( extraInfo!=null && extraInfo.contains("cmwap") ) { 
                                          //System.out.println("NETWORK CONNECTED SHUTDOWN    " + extraInfo); 
                                          //connectivity.stopUsingNetworkFeature(ConnectivityManager.TYPE_MOBILE, "wap"); 
                                            
                                          return true; 
                                      } 

                         } 

                       } 

                      } 

                     } 

                    return false; 

                  } 



          以上就是第一步,先判斷數據連接是否激活,沒有激活則代碼激活之。另外,激活的過程大概需要3到5秒,所以激活調用后,立即去判斷是否激活,返回的結果肯定是FALSE,如果等個10再去調用判斷,則會顯示成功,所以建議激活不要和聯網放在一起,我一般是啟動游戲,激活,關閉游戲時同時關掉激活。 


          第二步,就是聯網, 


          聯網方式最好不要用傳統的聯網,我一開始就是傳統的,比如。 


          CMNET 

          private int CountMoney(String urlstr) 
            { 
                
                
                String strHead = ""; 
                try{ 
                      URL url = new URL(urlstr); 
                    URLConnection conn = url.openConnection(); 
                    
                    String headerstr = conn.getHeaderField("Content-Type"); 
                      
                    if (headerstr!= null && headerstr.startsWith("text")) { 
                        conn = url.openConnection(); 
                    } 
                    
                    InputStream inputstream = conn.getInputStream(); 
                    ByteArrayOutputStream bytearrayoutputstream = new ByteArrayOutputStream(); 
                    byte abyte1[] = new byte[1024]; 
                    for(int k = 0; -1 != (k = inputstream.read(abyte1));) 
                        bytearrayoutputstream.write(abyte1, 0, k); 
                    
                    strHead = new String(bytearrayoutputstream.toByteArray(), "UTF-8"); 
                    
                    System.out.println("cmnet  " + strHead); 
                    
                    } 
                    catch (Exception e)    { 
                       
                        s_netmodewap = !s_netmodewap; 
                        return 2; 
                    } 
                    
                  if(strHead.indexOf("status=1301") > -1 || strHead.indexOf("status=1300") > -1) 
                  { 
                    return 1; 
                  } 
                  else 
                  { 
                    return 0; 
                  } 
                
            } 

            CMWAP,代理用得很糙,呵呵。 

            private int CountMoneyCMWAP(String urlstr) 
            { 
                
                
                String strHead = ""; 
                try{ 
                    
                    
                    
                    URL url = new URL(urlstr); 
                    Proxy proxy=new Proxy(java.net.Proxy.Type.HTTP,new InetSocketAddress("10.0.0.172",80)); 
                    HttpURLConnection connection=(HttpURLConnection) 
                    url.openConnection(proxy); 
                    String headerstr = connection.getHeaderField("Content-Type"); 
                    if (headerstr!= null && headerstr.startsWith("text")) { 
                        connection=(HttpURLConnection) 
                        url.openConnection(proxy); 
                    } 
                    
                    InputStream inputstream = connection.getInputStream(); 
                    ByteArrayOutputStream bytearrayoutputstream = new ByteArrayOutputStream(); 
                    byte abyte1[] = new byte[1024]; 
                    for(int k = 0; -1 != (k = inputstream.read(abyte1));) 
                        bytearrayoutputstream.write(abyte1, 0, k); 
                       
                    
                    strHead = new String(bytearrayoutputstream.toByteArray(), "UTF-8"); 

                    System.out.println("cmwap  " + strHead); 
                    } 
                    catch (Exception e)    { 
                        e.printStackTrace(); 
                        return 2; 
                    } 
                    
                 
                    
                  if(strHead.indexOf("status=1301") > -1 || strHead.indexOf("status=1300") > -1) 
                  { 
                    return 1; 
                  } 
                  else 
                  { 
                    return 0; 
                  } 
                
            } 


          以上都是傳統的聯網思維,所以連起來速度會很慢。后來經過移動OPHONE的人指點,終于弄明白了。如下,速度會快很多。 


          private int CountMoneyCMWAPNEWWAY(String urlstr) 
            { 
                
                
                String strHead = ""; 
                try{ 
                    
                    
                    if(!GameLet._self.isNetworkCMWAPAvailable()) 
                    { 
                        GameLet._self.ActiveNetWorkByMode("wap"); 
                        return 2; 
                    } 
                    
                    
                    int splashIndex = urlstr.indexOf("/", 7); 

                    String hosturl = urlstr.substring(7, splashIndex); 
                    String hostfile = urlstr.substring(splashIndex); 
                    
                    System.out.println("hosturl   " + hosturl); 
                    System.out.println("hostfile   " + hostfile); 

                    HttpHost proxy = new HttpHost( "10.0.0.172", 80, "http"); 
                    HttpHost target = new HttpHost(hosturl, 80, "http");       

                    DefaultHttpClient httpclient = new DefaultHttpClient(); 
                    httpclient.getParams().setParameter(ConnRoutePNames.DEFAULT_PROXY, proxy); 
                      
                    HttpGet req = new HttpGet(hostfile); 

                    HttpResponse rsp = httpclient.execute(target, req); 
                    HttpEntity entity = rsp.getEntity(); 

                    InputStream inputstream = entity.getContent(); 
                    ByteArrayOutputStream bytearrayoutputstream = new ByteArrayOutputStream(); 
                    byte abyte1[] = new byte[1024]; 
                    for(int k = 0; -1 != (k = inputstream.read(abyte1));) 
                       bytearrayoutputstream.write(abyte1, 0, k); 
                    
                    strHead = new String(bytearrayoutputstream.toByteArray(), "UTF-8"); 

                    httpclient.getConnectionManager().shutdown(); 
                    } 
                    catch (Exception e)    { 
                        return 2; 
                    } 
                    
                  if(strHead.indexOf("status=1301") > -1 || strHead.indexOf("status=1300") > -1) 
                  { 
                    return 1; 
                  } 
                  else 
                  { 
                    return 0; 
                  } 
                
            } 



          最后,有幾個PERRMISSION別忘了加了。 


          <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 
          <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" /> 



          就寫到這里,祝大家成功。

          補充一下:如果想準確的接收連接建立的通知事件,還需要監聽一個消息
          android.net.conn.CONNECTIVITY_CHANGE
          然后在Receiver程序中做個判斷
          NetworkInfo ni = intent.getParcelableExtra(ConnectivityManager.EXTRA_NETWORK_INFO);
          if (ni != null && ni.isConnected()&& NetAccess.NETWORK_AP.equals(Utils.getAPType(ni)))  {......}
          這樣就可以了。

          http://www.ophonesdn.com/forum/thread-2831-1-1.html


          ---------------------------------------------------------
          專注移動開發

          Android, Windows Mobile, iPhone, J2ME, BlackBerry, Symbian
          posted on 2010-09-14 14:56 TiGERTiAN 閱讀(426) 評論(0)  編輯  收藏 所屬分類: Android
          主站蜘蛛池模板: 东兴市| 吕梁市| 琼中| 柳林县| 长泰县| 逊克县| 尼勒克县| 枣强县| 翼城县| 宜兰县| 平乡县| 长治市| 阜阳市| 灵寿县| 和田县| 永州市| 淳安县| 墨脱县| 秀山| 黄平县| 漯河市| 繁昌县| 山阳县| 乐清市| 保康县| 阿克苏市| 通许县| 泽库县| 启东市| 洛宁县| 汝阳县| 天台县| 汉源县| 民乐县| 东光县| 台南县| 宾川县| 奉节县| 信宜市| 中阳县| 阜康市|