Android学习之路(二) Android项目 nju-wlan

前段时间疲于应付考试和各种作业,并没有很多时间来学习android。这几天考试已经结束,又可以学习android了,最好的学习方法就是自己动手编写应用项目,在实践中学习。因此我的学习之路以后都是做小应用来引导。

废话不多说,下面讲讲我的第一个应用Nju-WLAN,每次在学校里用手机登陆校园无线,都要用手机打开浏览器,再登录,感觉很不方便。所以我写了一个android客户端,来方便我的登录。

一、保存用户名密码

这里我盗版了QQ的界面,^_^,

第一个问题就是保存用户名密码。我采用的是java的属性文件来保存,写了一个文件类用来保存用户名密码。

package com.mayday.njuwifi;

/**
 * Created by mayday on 2015/1/14.
 */
import java.io.FileOutputStream;
import android.content.Context;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;
import java.io.File;
import java.io.FileInputStream;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.FileNotFoundException;
import java.io.IOException;

public class FileService {

    private Context context;
    public FileService(Context context){
        this.context = context;
    }

    /**
     * 把用户名和密码保存到手机ROM
     * @param username 要保存的用户名
     * @param password 输入要保存的密码
     * @param filename 保存到哪个文件
     * @return
     */
    public void saveUserInfoToRom(String username,String password,String filename) throws Exception{
        Properties pro = new Properties();
        pro.setProperty("username", username);
        pro.setProperty("password", password);
        File file = new File(context.getFilesDir(),filename);
        FileOutputStream fos =  new FileOutputStream(file);
        pro.store(fos,filename);
        fos.flush();
        fos.close();
    }

    public Properties getUserInfo(String filename) throws Exception{
        try{
            File file = new File(context.getFilesDir(),filename);
            FileInputStream fis = new FileInputStream(file);
            Properties pro = new Properties();
            pro.load(fis);
            fis.close();
            return pro;
        }catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

    public void removeUserInfo(String filename){
        try {
            File file = new File(context.getFilesDir(), filename);
            file.delete();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}

在主函数中,如果检查到记住密码被选中,就调用

private FileService fileService;

fileService = new FileService(this);

fileService.saveUserInfoToRom(username, password, "userInfo.properties"); //保存用户名密码到userInfo.properties文件中

如果以前保存,现在不保存

fileService.removeUserInfo("userInfo.properties"); //删除userInfo.properties文件

在下次登录时,就检查是否用这个文件,如果有直接从该文件中得到用户名和密码信息。

 try {
            Properties pro = fileService.getUserInfo("userInfo.properties");
            if (!TextUtils.isEmpty(pro.getProperty("username")) && !TextUtils.isEmpty(pro.getProperty("password"))){
                nameEdit.setText(pro.getProperty("username"));
                pwdEdit.setText(pro.getProperty("password"));
            }

        }catch(Exception e) {
            e.printStackTrace();
        }

二、Http的post请求

由于要模拟登录,需要采用基于http的post请求

我建了一个类用来处理登录,和退出登录。

package com.mayday.njuwifi;

/**
 * Created by mayday on 2015/1/9.
 */

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.URL;

import android.annotation.SuppressLint;
import android.annotation.TargetApi;
import android.os.Build;
import android.os.StrictMode;

public class NJUService {

    private   String username;//用户名

    private   String password;//密码

    private   String login_url="http://p.nju.edu.cn/portal/portal_io.do";//登录页面url

    @TargetApi(Build.VERSION_CODES.GINGERBREAD)
    @SuppressLint("NewApi")
    public  String login() throws Exception{
        System.out.println("login");
        StrictMode.ThreadPolicy policy=new StrictMode.ThreadPolicy.Builder().permitAll().build();
        StrictMode.setThreadPolicy(policy);

        String postData = "action=login&username="+username+"&password="+password;
        URL url = new URL(login_url);
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        conn.setConnectTimeout(20000);
        conn.setRequestMethod("POST");
        conn.setDoOutput(true);
        conn.setDoInput(true);
        conn.connect();
        OutputStreamWriter out= new OutputStreamWriter(conn.getOutputStream());
        out.write(postData);
        out.flush();
        out.close();

        InputStream ins = conn.getInputStream();
        String charset = "UTF-8";
        InputStreamReader inr = new InputStreamReader(ins, charset);
        BufferedReader br = new BufferedReader(inr);

        String line = "";
        StringBuffer sb = new StringBuffer();
        while((line = br.readLine())!=null)
        {
            sb.append(line);
        }
        inr.close();
        ins.close();

        conn.disconnect();

        return sb.toString();
    }

    public NJUService(){}

    public NJUService(String username, String password){
        this.username=username;
        this.password=password;
    }

    @TargetApi(Build.VERSION_CODES.GINGERBREAD)
    @SuppressLint("NewApi")
    public  String logout() throws Exception{

        System.out.println("logout");
        StrictMode.ThreadPolicy policy=new StrictMode.ThreadPolicy.Builder().permitAll().build();
        StrictMode.setThreadPolicy(policy);

        String postData = "action=logout";
        URL url = new URL(login_url);
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        conn.setConnectTimeout(5000);
        conn.setRequestMethod("POST");
        conn.setDoOutput(true);
        conn.setDoInput(true);
        conn.connect();
        OutputStreamWriter out= new OutputStreamWriter(conn.getOutputStream());
        out.write(postData);
        out.flush();
        out.close();

        InputStream ins = conn.getInputStream();
        String charset = "UTF-8";
        InputStreamReader inr = new InputStreamReader(ins, charset);
        BufferedReader br = new BufferedReader(inr);

        String line = "";
        StringBuffer sb = new StringBuffer();
        while((line = br.readLine())!=null)
        {
            sb.append(line);
        }
        inr.close();
        ins.close();

        conn.disconnect();

        return sb.toString();
    }

}

提交用户名密码到http://p.nju.edu.cn/portal/portal_io.do并得到返回信息。

三、判断当前wifi和gprs功能开启或关闭

我想让这个应用可以自动关闭gprs移动流量,并打开无线连入NJU-wlan

建了一个类用来管理无线

package com.mayday.njuwifi;

/**
 * Created by mayday on 2015/1/15.
 */
import android.net.wifi.WifiManager;
import android.net.wifi.WifiConfiguration;

public class WifiAdmin {

    private WifiManager wifiManager;

    public WifiAdmin(WifiManager wifiManager){
        this.wifiManager = wifiManager;
    }

    public void connect(String ssid) {
        Thread thread = new Thread(new ConnectRunnable(ssid));
        thread.start();
    }


    private WifiConfiguration createWifiInfo(String SSID) {
        WifiConfiguration config = new WifiConfiguration();
        config.allowedAuthAlgorithms.clear();
        config.allowedGroupCiphers.clear();
        config.allowedKeyManagement.clear();
        config.allowedPairwiseCiphers.clear();
        config.allowedProtocols.clear();
        config.SSID = """ + SSID + """;
        config.wepKeys[0] = "";
        config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
        config.wepTxKeyIndex = 0;
        return config;
    }

    public void disConnect(String ssid){
        WifiConfiguration wifiConfig = createWifiInfo(ssid);

        int netID = wifiManager.addNetwork(wifiConfig);
        wifiManager.disableNetwork(netID);
        wifiManager.disconnect();
    }

    class ConnectRunnable implements Runnable {
        private String ssid;

        public ConnectRunnable(String ssid) {
            this.ssid = ssid;
        }

        @Override
        public void run() {
            WifiConfiguration wifiConfig = createWifiInfo(ssid);
            int netID = wifiManager.addNetwork(wifiConfig);
            wifiManager.enableNetwork(netID, true);
        }
    }


}

通过public void connect(String ssid),在主函数中调用

private WifiManager wifiManager;
private WifiAdmin wifiAdmin;

wifiManager = (WifiManager)this.getSystemService(this.WIFI_SERVICE);

wifiAdmin = new WifiAdmin(wifiManager);

if (!wifiManager.isWifiEnabled()) {
            Toast.makeText(this, "您尚未打开wlan,正在打开wlan", Toast.LENGTH_SHORT).show();

            wifiManager.setWifiEnabled(true);
            while (wifiManager.getWifiState() == WifiManager.WIFI_STATE_ENABLING) {
                try {
                    // 为了避免程序一直while循环,让它睡个100毫秒检测……
                    Thread.sleep(100);
                } catch (InterruptedException ie) {
                    ie.printStackTrace();
                }
            }
            Toast.makeText(this, "成功开启wlan功能", Toast.LENGTH_SHORT).show();
        }else{
            Toast.makeText(this, "已开启wlan功能", Toast.LENGTH_SHORT).show();
        }

wifiAdmin.connect("NJU-WLAN");

GPRS流量

private ConnectivityManager mCM;


 mCM = (ConnectivityManager)this.getSystemService(this.CONNECTIVITY_SERVICE);

boolean isOpen = gprsIsOpenMethod("getMobileDataEnabled"); //为true gprs打开 ,false gprs关闭
        if (isOpen){
            Toast.makeText(this, "正在关闭GPRS移动流量", Toast.LENGTH_SHORT).show();
            setGprsEnable("setMobileDataEnabled", false);
        }else{
            Toast.makeText(this, "当前GPRS移动流量已关闭", Toast.LENGTH_SHORT).show();
        }


//检测GPRS是否打开
    private boolean gprsIsOpenMethod(String methodName)
    {
        Class cmClass   = mCM.getClass();
        Class[] argClasses  = null;
        Object[] argObject  = null;

        Boolean isOpen = false;
        try
        {
            Method method = cmClass.getMethod(methodName, argClasses);
            isOpen = (Boolean) method.invoke(mCM, argObject);
        } catch (Exception e)
        {
            e.printStackTrace();
        }
        return isOpen;
    }

    //开启/关闭GPRS
    private void setGprsEnable(String methodName, boolean isEnable)
    {
        Class cmClass   = mCM.getClass();
        Class[] argClasses  = new Class[1];
        argClasses[0]   = boolean.class;

        try
        {
            Method method = cmClass.getMethod(methodName, argClasses);
            method.invoke(mCM, isEnable);
        } catch (Exception e)
        {
            e.printStackTrace();
        }
    }

判断当前gprs流量开启的话,就关闭gprs移动流量。

四、Intent跳转和传值

只需要在后面加上你要跳转的avtivity.class,startActivity(it),就可实现跳转

Intent it = new Intent(this,loginSuccess.class);
it.putExtra("reply",reply);
startActivity(it);

it.putExtra("reply",reply);前面的是你传值的参数名字,后面是你传的真实值

在loginSuccess中,

Intent intent = getIntent();
String reply = intent.getStringExtra("reply");

就可得到传递的值。

第一个程序大概功能就是这样,里面很多东西都是从网上别的博客找到的。这虽然是一个很小的应用但涵盖了很多android知识。有必要把一些东西再系统详细的学习下。

稍后我将会把我的整个程序放到github上。

原文地址:https://www.cnblogs.com/maydayit/p/4228381.html