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