安卓系统下的目录权限问题

安卓系统在连接wifi的时候会保存连接的密码,这一配置信息保存在/data/misc/wifi/wpa_supplicant.conf目录下。

但是这个目录需要Root权限才能读取,但是有个问题是很多root了用户打开data目录的时候是空的,用rootexplore打开也是空的

我手中的一个百度小鸟平板用的4.2.2的系统就存在这个问题。

用adb shell命令打开平板目录尝试

shell@viewsonic82_6122:/ $ ls /data
ls /data
opendir failed, Permission denied
可以看到/data目录下的ls 命令被禁用了

看下面这个命令

shell@viewsonic82_6122:/ $ cd /data
cd /data
shell@viewsonic82_6122:/data $ cd misc
cd misc
shell@viewsonic82_6122:/data/misc $ cd wifi
cd wifi
/system/bin/sh: cd: /data/misc/wifi: Permission denied
可以看到cd命令的前两层命令正常,再往后面就被禁止使用cd命令了。

这个目录其实是存在的,我们可以通过root把目录权限改掉,让它暂时能访问。

下面是代码,其中获得目录root权限的代码是直接拿过来用的,在此表示感谢。

1.Activity的代码

package com.example.readwificfg;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.util.List;

import android.app.Activity;
import android.content.Context;
import android.net.wifi.WifiConfiguration;
import android.net.wifi.WifiManager;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;

import com.example.readwificfg.service.getRoot;

public class MainActivity extends Activity {
	
	private TextView tv_result;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		tv_result = (TextView) findViewById(R.id.tv_result);	
		
		//获得前两个路径的ROOT权限
		String path="/data/misc/wifi";			
		getRoot.upgradeRootPermission(path);
		path="/data/misc/wifi/wpa_supplicant.conf";		
		getRoot.upgradeRootPermission(path);
	}	
	
	public void readwificfg(View view){
		try {
			//逐行读取wpa_supplicant.conf里的文本内容,存到字符串result中
			File file = new File(
					"/data/misc/wifi/wpa_supplicant.conf");
			FileInputStream fls=new FileInputStream(file);
			BufferedReader br=new BufferedReader(new InputStreamReader(fls));
			String line=null;
			StringBuilder result=new StringBuilder();
			while((line=br.readLine())!=null){
				result.append(line);
				result.append("\n");
			}
			br.close();
			//把读出来的字符串显示到长文本框中
			tv_result.setText(result.toString());
			Toast.makeText(this, "读取wifi配置文件成功",Toast.LENGTH_SHORT).show();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			Toast.makeText(this, "读取wifi配置文件失败,请确保取得ROOT权限", Toast.LENGTH_SHORT).show();
		}
	}
	
	public void readwificfg2(View view){
		try {
			//创建WifiManager实例 
			WifiManager wfm=(WifiManager) this.getSystemService(Context.WIFI_SERVICE);
			//获得配置信息的List
			List<WifiConfiguration> configs=wfm.getConfiguredNetworks();
			StringBuilder result=new StringBuilder();
			String head="SSID"+"\t"+"密码"+"\n";
			result.append(head);
			//读每一个配置信息,并加到字符串
			for(WifiConfiguration config:configs){
				String str = config.SSID+"\t"+config.preSharedKey+"\n";
				result.append(str);				
			}
			tv_result.setText(result.toString());
			String size=String.valueOf(configs.size());
			Toast.makeText(this, "读取wifi配置,节点数目"+size, Toast.LENGTH_SHORT).show();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			Toast.makeText(this, "读取wifi配置失败", Toast.LENGTH_SHORT).show();
		}
	}

	

}

2.别人的获得root权限的代码

package com.example.readwificfg.service;

import java.io.DataOutputStream;

public class getRoot {

	
	/** 
	 * 应用程序运行命令获取 Root权限,设备必须已破解(获得ROOT权限) 
	 *  
	 * @return 应用程序是/否获取Root权限 
	 */  
	public static boolean upgradeRootPermission(String pkgCodePath) {  
	    Process process = null;  
	    DataOutputStream os = null;  
	    try {  
	        String cmd="chmod 777 " + pkgCodePath;  
	        process = Runtime.getRuntime().exec("su"); //切换到root帐号  
	        os = new DataOutputStream(process.getOutputStream());  
	        os.writeBytes(cmd + "\n");  
	        os.writeBytes("exit\n");  
	        os.flush();  
	        process.waitFor();  
	    } catch (Exception e) {  
	        return false;  
	    } finally {  
	        try {  
	            if (os != null) {  
	                os.close();  
	            }  
	            process.destroy();  
	        } catch (Exception e) {  
	        }  
	    }  
	    return true;  
	}
}
3.布局文件

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="${relativePackage}.${activityClass}" >

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:onClick="readwificfg"
        android:text="从固定路径读取wifi配置文件" />

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:onClick="readwificfg2"
        android:text="从API读取wifi配置,密码为*不可读" />

    <ScrollView
        android:layout_width="match_parent"
        android:layout_height="match_parent" >
        <TextView
            android:id="@+id/tv_result"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
    </ScrollView>

</LinearLayout>

再说明一下,上面的代码中第一个按钮实现的是从目录读取的,能读到配置文件,前提是要有root权限,root权限要执行两次,这里懒得改了

第二个按钮的代码使用API,但是拿到的密码是一个星号,API存的时候是把字符串存进去了,但是返回的时候返回*,第二个按钮的代码在我的2.2.2的系统上运行正常,4.2.2的系统读取失败



你可能感兴趣的:(安卓,权限,wifi,配置文件)