智能进行WIFI,CMWAP和CMNET的自动判断访问

来源:互联网 发布:江湖聊天室源码下载 编辑:程序博客网 时间:2024/05/23 01:49
1.由于开发过程当中,由于需要调用第三方的HTTP服务,而在正式上线的时候碰到了调用HTTP不通,经过网络这个学习工具,学到了一点点,原来在家里我一直都用的WIFI来测试,在没有WIFI的情况下,移动分CMWAP和CMNET两种访问方式网络,
简单一点来说,就是WIFT和CMNET就是直连网络,而CMWAP需要多了一个代理,现在我就简单处理了一下,如果有什么不对的地方,希望大家提出来,共同进步,
我是菜鸟我怕谁!哈!
智能进行WIFI,CMWAP和CMNET的自动判断访问
引用文件:
import android.app.AlertDialog;
import android.content.BroadcastReceiver;
import android.content.ContentResolver;
import android.content.ContentValues;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.database.Cursor;
import android.database.SQLException;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.net.Uri;
import android.net.wifi.WifiManager;
import android.telephony.TelephonyManager;
import android.widget.Toast;

变量定义
         Cursor cursor_current,cursor_need;
         Uri PREFERRED_APN_URI, APN_TABLE_URI;
         int newCreateAPN_Id;
         String APN_Id;
         TelephonyManager tm;
         WifiManager wifi;

         String strAPN;


使用到的函数如下:
    //获取当前APN属性
    private boolean getCurrentAPN(){
            PREFERRED_APN_URI = Uri.parse("content://telephony/carriers/preferapn");
            cursor_current = this.getContentResolver().query(PREFERRED_APN_URI, null, null, null, null);
            if(cursor_current != null && cursor_current.moveToFirst()){
                    String proxy = cursor_current.getString(cursor_current.getColumnIndex("proxy"));
                    String apn = cursor_current.getString(cursor_current.getColumnIndex("apn"));
                    String port = cursor_current.getString(cursor_current.getColumnIndex("port"));
                    String current = cursor_current.getString(cursor_current.getColumnIndex("current"));
                    if(proxy == null || apn == null || port == null || current == null
                                    || proxy.equals("") || port.equals("")){
                            return false;
                    }

                    if((proxy.equals("10.0.0.172") || proxy.equals("010.000.000.172")) && port.equals("80") &&
                                    apn.equals("cmwap") && current.equals("1")){
                            return true;
                    }
            }
                return false;           
    }
    
    //检查是否存在cmwap网络
    private boolean checkHasWapAPN(){
            APN_TABLE_URI = Uri.parse("content://telephony/carriers");
            cursor_need = this.getContentResolver().query(APN_TABLE_URI, null, null, null, null);
    
            while(cursor_need != null && cursor_need.moveToNext()){
                    String id = cursor_need.getString(cursor_need.getColumnIndex("_id"));      
                String port = cursor_need.getString(cursor_need.getColumnIndex("port"));  
                String proxy = cursor_need.getString(cursor_need.getColumnIndex("proxy"));
                String current = cursor_need.getString(cursor_need.getColumnIndex("current"));
                String mmsc = cursor_need.getString(cursor_need.getColumnIndex("mmsc"));
                if(proxy == null || port == null || current == null){
                        continue;
                }
               if((proxy.equals("10.0.0.172") || proxy.equals("010.000.000.172"))
                                && port.equals("80") && current.equals("1")
                                && mmsc == null){
                        APN_Id = id;
                        return true;
                }
            }
                return false;          
    }
    
    //设置为cmwap网络
    public boolean setAPN(int id){
                            
            boolean res = false;
            ContentResolver resolver = this.getContentResolver();
            ContentValues values = new ContentValues();
            values.put("apn_id", id);
            try{
                    resolver.update(PREFERRED_APN_URI, values, null, null);
                    Cursor c = resolver.query(PREFERRED_APN_URI, new String[]{"name", "apn"}, "_id=" + id, null, null);
                    if(c != null){
                            res = true;
                            c.close();
                    }
            }catch(SQLException e){
                    Log.e("lhl", e.getMessage());
            }
                return res;
    }
   
    //添加cmwap网络
    private int addCmwapAPN(){
            ContentResolver cr = this.getContentResolver();
            ContentValues cv = new ContentValues();
            cv.put("name", "cmwap");
            cv.put("apn", "cmwap");
            cv.put("proxy", "010.000.000.172");
            cv.put("port", "80");
            cv.put("current", 1);

            tm = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);
            String imsi =tm.getSubscriberId();
            if(imsi != null){
                    if(imsi.startsWith("46000")){
                            cv.put("numeric", "46000");
                            cv.put("mcc", "460");
                            cv.put("mnc", "00");
                    }
                    else if(imsi.startsWith("46002")){
                            cv.put("numeric", "46002");
                            cv.put("mcc", "460");
                            cv.put("mnc", "02");
                    }
            }
            
            Cursor c = null;
            try{
                    Uri newRow = cr.insert(APN_TABLE_URI, cv);
                    if(newRow != null){
                            c = cr.query(newRow, null, null, null, null);
                            c.moveToFirst();
                            String id = c.getString(c.getColumnIndex("_id"));
                            setAPN(Integer.parseInt(id));
                            return Integer.parseInt(id);
                    }
                    
            }catch(SQLException e){
                    Log.e("lhl", e.getMessage());
            }
            finally{
                    if(c != null){
                            c.close();
                    }
            }        
                return 0;           
    }            

判断逻辑如下:
                private Search search;
                //网络判断
                
                //如果wifi是打开的,则直接调用就可以了
                    wifi = (WifiManager)getSystemService(Context.WIFI_SERVICE);
                    if(wifi.isWifiEnabled()){
                            strAPN = "WIFI";
                            search.asyncRequest(strAPN, listener);     
                            return;
                    }
                    
            boolean isCmwap = getCurrentAPN();
            boolean wCheckWapApn = checkHasWapAPN();
            if(!isCmwap){        
                    if(!wCheckWapApn){
                            newCreateAPN_Id = addCmwapAPN();
                            strAPN = "CMNET";
                    }
                    else{
                            strAPN = "CMNET";
                    }try{
                            Thread.sleep(1000);
                    }catch(InterruptedException e){
                            e.printStackTrace();
                    }
            }
            else{
                    strAPN = "CMWAP";
            }
            //异步调用
            search.asyncRequest(strAPN, listener);                  

            //异步调用类:
package com.search.weather;

import com.search.RequestListener;
import com.search.common.HttpUtils;

import android.os.Bundle;
import android.util.Log;

/**
* 查询类
* @author Administrator
*
*/
public class Search {
        
        private static final String HTTP_URL = "http://sds.XXXXXX.com/getinfo";
        private static final String HTTP_WAP_URL = "http://10.0.0.172/getinfo";
        private static final String METHOD = "GET";
        private static final String LOG_TAG = "XXX";
        
        
        public String request(String strAPN){
                if(woeid != null){
                        Bundle params = new Bundle();
                        
                        
                        if (strAPN.equals("CMWAP"))
                        {
                                return HttpUtils.openUrl1(HTTP_WAP_URL, METHOD, params,null,strAPN);                                
                        }
                        else
                        {
                                return HttpUtils.openUrl(HTTP_URL, METHOD, params,null,strAPN);
                        }                        
                }else{
                        return null;
                }
        }
        
        //异步封装
        public void asyncRequest(final String strAPN, final RequestListener listener){
                
                new Thread(new Runnable() {
                        
                        @Override
                        public void run() {
                                
                                try {
                                        String response = request(strAPN);
                                        listener.onComplete(response);
                                } catch (Exception e) {
                                        Log.e(LOG_TAG, e.getMessage());
                                        listener.onException(e);
                                }
                                
                        }
                }).start();
        }

}
对于CMWAP的方法需要做以下逻辑处理:

        public static String openUrl(String url, String method, Bundle params, String enc, String strAPN){
                
                String response = null;
                
                if(method.equals("GET")){
                        url = url + "?" + encodeUrl(params);
                }
                
                try {
                        //Log.d(LOG_TAG, "Url:"+url);                        
                        HttpURLConnection conn = (HttpURLConnection) new URL(url).openConnection();
                        
                        conn.setRequestProperty("User-Agent", System.getProperties()
                                        .getProperty("http.agent")
                                        );
                        if (strAPN.equals("CMWAP"))
                        {
                                conn.setRequestProperty("X-Online-Host", "sds.XXXXXX.com");//这里需要换成调用的真正的网址
                                conn.setDoInput(true);
                        }
                        
                        conn.setConnectTimeout(30000);
                        conn.setReadTimeout(30000); //设置超时时间
                        
                        if(method.equals("POST")){
                                conn.setRequestMethod("POST");
                                conn.setDoOutput(true);
                                conn.getOutputStream().write(encodeUrl(params).getBytes("UTF-8"));
                        }
                        response = read(conn.getInputStream(),enc);
                } catch (Exception e) {
                        //Log.e(LOG_TAG, e.getMessage());
                        throw new RuntimeException(e.getMessage(),e);
                }
                return response;
        }

最后还要在AndroidManifest.xml加上以下权限:
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>
    <uses-permission android:name="android.permission.WRITE_APN_SETTINGS"></uses-permission>
    <uses-permission android:name="android.permission.INTERNET"></uses-permission>
    
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission>
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"></uses-permission> 
   

报文的返回解析这里就不写了,上面只是我在开发过程中的碰到问题以及解决方法,如果大家有更好的方法,请指导一下,共同学习....
有部分坛友对这一块还是比较有兴趣的,上面写得还是有点乱,以下部分代码作为以上思路的实战,个人感觉清晰一点:
我就以一个android应用当中都要实现的在线更新APK模块的实例对它来一次总结:
updatepro.xml的代码:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"  
    >        
        <!-- content栏 -->        
        <ProgressBar android:id="@+id/progressBar"
        style="?android:attr/progressBarStyleHorizontal"
        android:layout_width="200dip"
        android:layout_height="wrap_content"
        android:max="100"
        android:progress="50"
        android:layout_marginTop="20dp" 
        android:secondaryProgress="75" />                        
</LinearLayout>

//-------------------------------------------------------------------------

package com.search.update;

import java.io.File;   
import java.io.FileOutputStream;   
import java.io.IOException;   
import java.io.InputStream;   
import java.net.HttpURLConnection;   
import java.net.MalformedURLException;   
import java.net.URL;   
import java.util.List;   
  
import javax.xml.parsers.ParserConfigurationException;   
import javax.xml.parsers.SAXParser;   
import javax.xml.parsers.SAXParserFactory;   
  
import org.xml.sax.Attributes;   
import org.xml.sax.SAXException;   
import org.xml.sax.helpers.DefaultHandler;   
  
import com.search.R;
import android.app.Activity;   
import android.app.ActivityManager;   
import android.app.AlertDialog;
import android.app.ActivityManager.RunningAppProcessInfo;   
import android.content.ComponentName;   
import android.content.Context;   
import android.content.DialogInterface;
import android.content.Intent;   
import android.content.pm.ResolveInfo;   
import android.net.Uri;   
import android.os.Bundle;   
import android.os.Environment;   
import android.os.Handler;   
import android.os.Message;   
import android.util.Log;
import android.view.View;   
import android.widget.Button;
import android.widget.ProgressBar;   
import android.widget.TextView;
import android.widget.Toast;

import android.app.AlertDialog;
import android.content.BroadcastReceiver;
import android.content.ContentResolver;
import android.content.ContentValues;
import android.database.Cursor;
import android.database.SQLException;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.net.Uri;
import android.net.wifi.WifiManager;
import android.telephony.TelephonyManager;
import android.widget.Toast;

/**  
* @author tuoer123

*  
*/  
public class UpdateApplication extends Activity {   
        Cursor cursor_current,cursor_need;
        Uri PREFERRED_APN_URI, APN_TABLE_URI;
        int newCreateAPN_Id;
        String APN_Id;
        TelephonyManager tm;
        WifiManager wifi;        
        private String strAPN;
        
    //版本标识
        private String  strFlag ="";
    
        private String APKNAME = "XX.apk";
    
    private String apkUrl="http://XX.XX.XX.XX:802/XX.apk";   
    private String apkUrl1="http://10.0.0.172/XX.apk";
       
    private ProgressBar progressBar;   
          
       
    /** Called when the activity is first created. */  
    @Override  
    public void onCreate(Bundle savedInstanceState) {   
        super.onCreate(savedInstanceState);   
                
                Bundle bundle = this.getIntent().getExtras();
        
            strFlag = bundle.getString("strFlag");
                
        strAPN = "WIFI";
        
            if (strFlag.equals("1"))
            {
                        new AlertDialog.Builder(UpdateApplication.this).setTitle("提示").setMessage("发现新版本,是否更新?")
                        .setPositiveButton("确定",
                    new DialogInterface.OnClickListener(){
                        public void onClick(DialogInterface dialoginterface, int i){
                            
                                setContentView(R.layout.updatepro); 
                                
                                new Thread(){ 
                                     public void run(){ 
                                        // do something
                                progressBar = (ProgressBar) findViewById(R.id.progressBar);                              
                                        
                                        progressBar.setIndeterminate(false);    
                                        progressBar.setVisibility(View.VISIBLE);   
                                           
                                        progressBar.setMax(100);     
                                        progressBar.setProgress(0);   
                                        
                                            downloadAPK(apkUrl);
                                            progressBar.setProgress(30);
                                               
                                            invokeAPK();
                                            progressBar.setProgress(60);
                                            
                                installAPK();                                
                                progressBar.setProgress(100);                                             
                                     } 
                                }.start(); 
                        }
                        }
                        ).setNegativeButton("退出", new DialogInterface.OnClickListener() {

                    public void onClick(DialogInterface dialog, int which) {
                                    
                                    finish();
                            }
                    }).show();                    
            }
            else
            {
                        new AlertDialog.Builder(UpdateApplication.this).setTitle("提示").setMessage("已经是最新版本!")
                        .setPositiveButton("确定",
                    new DialogInterface.OnClickListener(){
                        public void onClick(DialogInterface dialoginterface, int i){
                                finish();
                             }
                    }
                        ).show();              
            }           
    }   
    
           
    private void downloadAPK(String apkUrl) {   
        String filePath = getSDPath() +"/"+ APKNAME;   
        URL url = null;   
        
            //网络判断
            
            //如果wifi是打开的,则直接调用就可以了
                wifi = (WifiManager)getSystemService(Context.WIFI_SERVICE);
                if(wifi.isWifiEnabled()){
                        strAPN = "WIFI";
                try {   
                    url = new URL(apkUrl);   
                    HttpURLConnection con = (HttpURLConnection) url.openConnection();
                                
                    InputStream in = con.getInputStream();   
                    File fileOut = new File(filePath);   
                    FileOutputStream out = new FileOutputStream(fileOut);   
                    byte[] bytes = new byte[1024];   
                    int c;   
                    while ((c = in.read(bytes)) != -1) {   
                        out.write(bytes, 0, c);   
                    }   
                    in.close();   
                    out.close();   
                } catch (Exception e) {   
                    e.printStackTrace();   
                }   
                
                        return;
                }
                
        boolean isCmwap = getCurrentAPN();
        boolean wCheckWapApn = checkHasWapAPN();
        if(!isCmwap){        
                if(!wCheckWapApn){
                        newCreateAPN_Id = addCmwapAPN();
                        strAPN = "CMNET";
                }
                else{
                        strAPN = "CMNET";
                }try{
                        Thread.sleep(1000);
                }catch(InterruptedException e){
                        e.printStackTrace();
                }
        }
        else{
                strAPN = "CMWAP";
        }       
        
        
        try {
                if (strAPN.equals("CMWAP"))
                {
              url = new URL(apkUrl1);
                }
                else
                {
                  url = new URL(apkUrl);
                }
            HttpURLConnection con = (HttpURLConnection) url.openConnection();   
                        
            if (strAPN.equals("CMWAP"))
                        {
                                con.setRequestProperty("X-Online-Host", "XX.XX.XX.XX:802");
                                con.setDoInput(true);
                        } 
            
            InputStream in = con.getInputStream();   
            File fileOut = new File(filePath);   
            FileOutputStream out = new FileOutputStream(fileOut);   
            byte[] bytes = new byte[1024];   
            int c;   
            while ((c = in.read(bytes)) != -1) {   
                out.write(bytes, 0, c);   
            }   
            in.close();   
            out.close();   
        } catch (Exception e) {   
            e.printStackTrace();   
        }   
    }   
       
    private void installAPK() {   
        String fileName = getSDPath() + "/" + APKNAME;   
        Intent intent = new Intent(Intent.ACTION_VIEW);   
        intent.setDataAndType(Uri.fromFile(new File(fileName)), "application/vnd.android.package-archive");   
        startActivity(intent);   
    }   
       
    private void invokeAPK() { 
            Uri packageURI = Uri.parse("package:com.search.MainActivity");   
            Intent uninstallIntent = new Intent(Intent.ACTION_DELETE, packageURI);   
            startActivity(uninstallIntent);
    }  
    
    private String getSDPath() {   
        File sdDir = null;   
        boolean sdCardExist = Environment.getExternalStorageState().equals(   
                android.os.Environment.MEDIA_MOUNTED); // determine whether sd card is exist   
        if (sdCardExist) {   
            sdDir = Environment.getExternalStorageDirectory();// get the root directory   
        }   
        return sdDir.toString();   
    }
    
    //------------------------------------------网络部分--------------------------------------------
    
           //获取当前APN属性
    private boolean getCurrentAPN(){
            PREFERRED_APN_URI = Uri.parse("content://telephony/carriers/preferapn");
            cursor_current = this.getContentResolver().query(PREFERRED_APN_URI, null, null, null, null);
            if(cursor_current != null && cursor_current.moveToFirst()){
                    String proxy = cursor_current.getString(cursor_current.getColumnIndex("proxy"));
                    String apn = cursor_current.getString(cursor_current.getColumnIndex("apn"));
                    String port = cursor_current.getString(cursor_current.getColumnIndex("port"));
                    String current = cursor_current.getString(cursor_current.getColumnIndex("current"));
                    if(proxy == null || apn == null || port == null || current == null
                                    || proxy.equals("") || port.equals("")){
                            return false;
                    }

                    if((proxy.equals("10.0.0.172") || proxy.equals("010.000.000.172")) && port.equals("80") &&
                                    apn.equals("cmwap") && current.equals("1")){
                            return true;
                    }
            }
                return false;           
    }
    
    //检查是否存在cmwap网络
    private boolean checkHasWapAPN(){
            APN_TABLE_URI = Uri.parse("content://telephony/carriers");
            cursor_need = this.getContentResolver().query(APN_TABLE_URI, null, null, null, null);
    
            while(cursor_need != null && cursor_need.moveToNext()){
                    String id = cursor_need.getString(cursor_need.getColumnIndex("_id"));      
                String port = cursor_need.getString(cursor_need.getColumnIndex("port"));  
                String proxy = cursor_need.getString(cursor_need.getColumnIndex("proxy"));
                String current = cursor_need.getString(cursor_need.getColumnIndex("current"));
                String mmsc = cursor_need.getString(cursor_need.getColumnIndex("mmsc"));
                if(proxy == null || port == null || current == null){
                        continue;
                }
               if((proxy.equals("10.0.0.172") || proxy.equals("010.000.000.172"))
                                && port.equals("80") && current.equals("1")
                                && mmsc == null){
                        APN_Id = id;
                        return true;
                }
            }
                return false;          
    }
    
    //设置为cmwap网络
    public boolean setAPN(int id){
                            
            boolean res = false;
            ContentResolver resolver = this.getContentResolver();
            ContentValues values = new ContentValues();
            values.put("apn_id", id);
            try{
                    resolver.update(PREFERRED_APN_URI, values, null, null);
                    Cursor c = resolver.query(PREFERRED_APN_URI, new String[]{"name", "apn"}, "_id=" + id, null, null);
                    if(c != null){
                            res = true;
                            c.close();
                    }
            }catch(SQLException e){
                    Log.e("lhl", e.getMessage());
            }
                return res;
    }
   
    //添加cmwap网络
    private int addCmwapAPN(){
            ContentResolver cr = this.getContentResolver();
            ContentValues cv = new ContentValues();
            cv.put("name", "cmwap");
            cv.put("apn", "cmwap");
            cv.put("proxy", "010.000.000.172");
            cv.put("port", "80");
            cv.put("current", 1);

            tm = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);
            String imsi =tm.getSubscriberId();
            if(imsi != null){
                    if(imsi.startsWith("46000")){
                            cv.put("numeric", "46000");
                            cv.put("mcc", "460");
                            cv.put("mnc", "00");
                    }
                    else if(imsi.startsWith("46002")){
                            cv.put("numeric", "46002");
                            cv.put("mcc", "460");
                            cv.put("mnc", "02");
                    }
            }
            
            Cursor c = null;
            try{
                    Uri newRow = cr.insert(APN_TABLE_URI, cv);
                    if(newRow != null){
                            c = cr.query(newRow, null, null, null, null);
                            c.moveToFirst();
                            String id = c.getString(c.getColumnIndex("_id"));
                            setAPN(Integer.parseInt(id));
                            return Integer.parseInt(id);
                    }
                    
            }catch(SQLException e){
                    Log.e("lhl", e.getMessage());
            }
            finally{
                    if(c != null){
                            c.close();
                    }
            }        
                return 0;           
    }       
}  
原创粉丝点击