当前位置:   article > 正文

安卓系统下的目录权限问题_android /data/misc/

android /data/misc/

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

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

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

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

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

看下面这个命令

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

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

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

1.Activity的代码

  1. package com.example.readwificfg;
  2. import java.io.BufferedReader;
  3. import java.io.File;
  4. import java.io.FileInputStream;
  5. import java.io.InputStreamReader;
  6. import java.util.List;
  7. import android.app.Activity;
  8. import android.content.Context;
  9. import android.net.wifi.WifiConfiguration;
  10. import android.net.wifi.WifiManager;
  11. import android.os.Bundle;
  12. import android.view.View;
  13. import android.widget.TextView;
  14. import android.widget.Toast;
  15. import com.example.readwificfg.service.getRoot;
  16. public class MainActivity extends Activity {
  17. private TextView tv_result;
  18. @Override
  19. protected void onCreate(Bundle savedInstanceState) {
  20. super.onCreate(savedInstanceState);
  21. setContentView(R.layout.activity_main);
  22. tv_result = (TextView) findViewById(R.id.tv_result);
  23. //获得前两个路径的ROOT权限
  24. String path="/data/misc/wifi";
  25. getRoot.upgradeRootPermission(path);
  26. path="/data/misc/wifi/wpa_supplicant.conf";
  27. getRoot.upgradeRootPermission(path);
  28. }
  29. public void readwificfg(View view){
  30. try {
  31. //逐行读取wpa_supplicant.conf里的文本内容,存到字符串result中
  32. File file = new File(
  33. "/data/misc/wifi/wpa_supplicant.conf");
  34. FileInputStream fls=new FileInputStream(file);
  35. BufferedReader br=new BufferedReader(new InputStreamReader(fls));
  36. String line=null;
  37. StringBuilder result=new StringBuilder();
  38. while((line=br.readLine())!=null){
  39. result.append(line);
  40. result.append("\n");
  41. }
  42. br.close();
  43. //把读出来的字符串显示到长文本框中
  44. tv_result.setText(result.toString());
  45. Toast.makeText(this, "读取wifi配置文件成功",Toast.LENGTH_SHORT).show();
  46. } catch (Exception e) {
  47. // TODO Auto-generated catch block
  48. e.printStackTrace();
  49. Toast.makeText(this, "读取wifi配置文件失败,请确保取得ROOT权限", Toast.LENGTH_SHORT).show();
  50. }
  51. }
  52. public void readwificfg2(View view){
  53. try {
  54. //创建WifiManager实例
  55. WifiManager wfm=(WifiManager) this.getSystemService(Context.WIFI_SERVICE);
  56. //获得配置信息的List
  57. List<WifiConfiguration> configs=wfm.getConfiguredNetworks();
  58. StringBuilder result=new StringBuilder();
  59. String head="SSID"+"\t"+"密码"+"\n";
  60. result.append(head);
  61. //读每一个配置信息,并加到字符串
  62. for(WifiConfiguration config:configs){
  63. String str = config.SSID+"\t"+config.preSharedKey+"\n";
  64. result.append(str);
  65. }
  66. tv_result.setText(result.toString());
  67. String size=String.valueOf(configs.size());
  68. Toast.makeText(this, "读取wifi配置,节点数目"+size, Toast.LENGTH_SHORT).show();
  69. } catch (Exception e) {
  70. // TODO Auto-generated catch block
  71. e.printStackTrace();
  72. Toast.makeText(this, "读取wifi配置失败", Toast.LENGTH_SHORT).show();
  73. }
  74. }
  75. }

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

  1. package com.example.readwificfg.service;
  2. import java.io.DataOutputStream;
  3. public class getRoot {
  4. /**
  5. * 应用程序运行命令获取 Root权限,设备必须已破解(获得ROOT权限)
  6. *
  7. * @return 应用程序是/否获取Root权限
  8. */
  9. public static boolean upgradeRootPermission(String pkgCodePath) {
  10. Process process = null;
  11. DataOutputStream os = null;
  12. try {
  13. String cmd="chmod 777 " + pkgCodePath;
  14. process = Runtime.getRuntime().exec("su"); //切换到root帐号
  15. os = new DataOutputStream(process.getOutputStream());
  16. os.writeBytes(cmd + "\n");
  17. os.writeBytes("exit\n");
  18. os.flush();
  19. process.waitFor();
  20. } catch (Exception e) {
  21. return false;
  22. } finally {
  23. try {
  24. if (os != null) {
  25. os.close();
  26. }
  27. process.destroy();
  28. } catch (Exception e) {
  29. }
  30. }
  31. return true;
  32. }
  33. }
3.布局文件

  1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2. xmlns:tools="http://schemas.android.com/tools"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent"
  5. android:orientation="vertical"
  6. tools:context="${relativePackage}.${activityClass}" >
  7. <Button
  8. android:layout_width="wrap_content"
  9. android:layout_height="wrap_content"
  10. android:onClick="readwificfg"
  11. android:text="从固定路径读取wifi配置文件" />
  12. <Button
  13. android:layout_width="wrap_content"
  14. android:layout_height="wrap_content"
  15. android:onClick="readwificfg2"
  16. android:text="从API读取wifi配置,密码为*不可读" />
  17. <ScrollView
  18. android:layout_width="match_parent"
  19. android:layout_height="match_parent" >
  20. <TextView
  21. android:id="@+id/tv_result"
  22. android:layout_width="wrap_content"
  23. android:layout_height="wrap_content" />
  24. </ScrollView>
  25. </LinearLayout>

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

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



声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/89220
推荐阅读
相关标签
  

闽ICP备14008679号