将文件创建到系统android 4.4.2

时间:2014-04-25 12:19:19

标签: java android android-activity

我不知道为什么因为我切换到kitkat我的应用程序无法在系统中创建任何文件(此方法适用于android 4.1.2)。我的应用程序具有su权限,将系统挂载为RW,并在清单中声明READ和WRITE_EXTERNAL_STORAGE权限。 Logcats告诉我它允许SU权限但没有错误。

它不起作用的代码如下所示。

File file = new File(Environment.getRootDirectory().getPath().toString(), "/etc/init.d/script");

清单

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.hasta.cocoremanager"
android:versionCode="1"
android:versionName="1.7" >

<uses-sdk
    android:minSdkVersion="16"
    android:targetSdkVersion="19" />

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

<application
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme">       
    <activity
        android:name="com.hasta.cocoremanager.Main"
        android:label="@string/app_name" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
</application>

3 个答案:

答案 0 :(得分:1)

自4.4.2以来,设备存储上有新的IO规则:
Article

简而言之:现在您只能在应用程序的文件夹中书写。

答案 1 :(得分:0)

确保该文件对每个人都具有读/写权限。

Runtime.getRuntime().exec(new String[] { "su", "-c", "chown 777 /etc/init.d/script" });

现在您将能够获得该文件的实例。

如果文件不存在,请先运行

Runtime.getRuntime().exec(new String[] { "su", "-c", "echo '#' > /etc/init.d/script" });

编辑:在不知道你想如何使用文件实例的情况下,我会采取措施

File file = null;
try
{
    file = new File(Environment.getRootDirectory().getPath().toString(), "/etc/init.d/script");
}
catch (Exception e)
{
    // Cannot get file so set permissions.
    Runtime.getRuntime().exec(new String[] { "su", "-c", "chown 777 /etc/init.d/script" });
    try
    {
        file = new File(Environment.getRootDirectory().getPath().toString(), "/etc/init.d/script");
    }
    catch (Exception e)
    {
        // File does not exits, so create it.
        Runtime.getRuntime().exec(new String[] { "su", "-c", "echo '#' > /etc/init.d/script" });
        // Now set permissions.
        Runtime.getRuntime().exec(new String[] { "su", "-c", "chown 777 /etc/init.d/script" });
        try
        {
            file = new File(Environment.getRootDirectory().getPath().toString(), "/etc/init.d/script");
        }
        catch (Exception e)
        {
             // Should never get here.
        }    
}

// Do stuff with your file.

您可以随时在应用用户区域执行此操作,然后执行

Runtime.getRuntime().exec(new String[] { "su", "-c", "cp " + Environment.getDataDirectory() + "/script /etc/init.d/script" });

关于调用su的说明,这种语法也有效。

Runtime.getRuntime().exec("su -c cp " + Environment.getDataDirectory() + "/script /etc/init.d/script");

答案 2 :(得分:-1)

设置两者的清单权限:

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

因为您还需要RW和READ的读取权限