android - 从应用程序内部更改有根设备的系统设置

时间:2011-09-12 18:16:22

标签: android root

我正在尝试从应用内部更改描述here的短信限制。假设该应用程序在root设备上运行。我正在使用RootTools检查设备是否已植根。我正在试图找出如何将实际设置写入settings.db。任何可以帮助我的建议都受到高度赞赏。

提前致谢。

3 个答案:

答案 0 :(得分:7)

我通过这样做解决了这个问题:

  • /data/data/com.android.providers.settings/databases/settings.db复制到我的应用程序文件夹/data/data/my_app_directory/
  • 使用SQLiteDatabase类更新数据库中的表。
  • 将数据库从/data/data/my_app_directory/settings.db复制回/data/data/com.android.providers.settings/databases/

使用RootTools.sendShell

完成复制操作

答案 1 :(得分:1)

是的,如果您具有root访问权限,则可以执行此操作。这是一个漫长的过程,但你可以这样做:

步骤:从设备中使用settings.db/data/data/com.android.providers.settings/databases/复制RootBrowser,然后使用您要更新的sqliteBrowser更改值,而不是更新settings.db和put在项目的assets包中

第2步:使用asset manager将此文件复制到您的应用程序文件夹(您可以访问的任何位置)

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

此功能将从资产中复制文件

public static void copyAssets(Context context, String assetPath, String outFilename) {
        AssetManager assetManager = context.getAssets();
        InputStream in = null;
        OutputStream out = null;
        try {
            in = assetManager.open(assetPath);
            File outFile = new File(context.getExternalFilesDir(null), outFilename);

            out = new FileOutputStream(outFile);
            copyFile(in, out);
        } catch (IOException e) {
            Log.e(TAG, "Failed to copy asset: " + outFilename, e);
        } finally {
            if (in != null) {
                try {
                    in.close();
                } catch (IOException e) {
                }
            }
            if (out != null) {
                try {
                    out.close();
                } catch (IOException e) {
                }
            }
        }
    }

public static void copyFile(InputStream in, OutputStream out) throws IOException {
        byte[] buffer = new byte[1024];
        int read;
        while ((read = in.read(buffer)) != -1) {
            out.write(buffer, 0, read);
        }
    }

步骤3:覆盖系统settings.db文件系统路径(destPath)为/data/data/com.android.providers.settings/databases/

public static void copyToSystem(final String sourceFilePath, final String destPath) {
        Thread background = new Thread(new Runnable() {

            @Override
            public void run() {
                try {
                    Process process = Runtime.getRuntime().exec("su");
                    DataOutputStream os = new DataOutputStream(process.getOutputStream());
//                    
                    os.writeBytes("cp -f " + sourceFilePath + " " + destPath + "\n");
                    os.flush();
                    os.writeBytes("exit\n");
                    os.flush();
                    process.waitFor();
                    process.waitFor();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                    Log.e(TAG, e.toString());
                } catch (IOException e) {
                    e.printStackTrace();
                    Log.e(TAG, e.toString());
                }
            }
        });
        background.start();
    }

第4步:重启设备

这一切都完成了。

答案 2 :(得分:0)

最新答案,但您无需复制settings.db,可以使用RootTools之类的工具来更新它

CommandCapture commandLogcat = new CommandCapture(0, "sqlite3 /data/data/com.android.providers.settings/databases/settings.db \"UPDATE secure SET value = '192.168.2.140' WHERE name = 'eth_ip';\"");
RootTools.getShell(true).add(commandLogcat).getExitCode();