【问题标题】:How to execute a chmod in Android - API 8?如何在 Android - API 8 中执行 chmod?
【发布时间】:2014-09-15 01:50:36
【问题描述】:

我在 Android 2.3 上运行播放 mp3 的应用程序时遇到问题。 这些mp3从远程服务器下载到/data/data/com.my.package.name/,默认文件权限为-rw-------。

与 post HONEYCOMB 设备不同(根据我的测试),如果文件权限不是 -rw-rw-rw-,媒体播放器会拒绝读取 mp3。

我显然验证了如果我使用 adb shell 将文件权限设置为 666,那么媒体播放器会成功读取它。

所以,经过网上的一些研究,我在编写文件后尝试实现以下代码:

String chmodString = "chmod 666 " + getActivity().getApplicationContext().getFilesDir().getParentFile().getPath() +"/" + fileName;
Process sh = Runtime.getRuntime().exec("su", null, new File("/system/bin/"));
OutputStream osChgPerms = sh.getOutputStream();
try {
    osChgPerms.write((chmodString).getBytes("ASCII"));
    osChgPerms.flush();
    osChgPerms.close();
    sh.waitFor();
} catch (InterruptedException e) {
    Log.d("2ndGuide", "InterruptedException." + e);
} catch(IOException e) {
    Log.d("2ndGuide", "IO Exception." + e);
}

这段代码在片段中执行,但我认为这不会改变任何东西。

不幸的是,如果此代码在 HONEYCOMB 后的设备上工作,它没有用处,

osChgPerms.write((chmodString).getBytes("ASCII")); 

在我真正需要的地方抛出一个IOException: broken pipe on Android 2.3

其实我真的不知道问题是出在chmod还是出在执行方式上。

任何解决方案让它工作,或者让媒体播放器在 pre HONEYCOMB 上工作而不更改文件权限?

【问题讨论】:

  • 没有理由为此使用“su”,因为这些文件已经归您的用户所有。使用 File 类的 setReadable(true, false) (如果你坚持的话,可以写,虽然这看起来没有必要)。
  • @ChrisStratton 在 Android API 9+ 中
  • 是的,克里斯,你是对的,“su”不应该是必要的,但正如 Jared 所说,不可能使用 setReadable()

标签: android linux media-player chmod


【解决方案1】:

很好的问题,前段时间我也遇到过这个问题!

使用 Java + Android(用户必须有 chmod):

文件夹:

Runtime.getRuntime().exec("chmod -R 777 " + FOLDERNAME);

文件:

Runtime.getRuntime().exec("chmod 777 " + FILENAME);

问题:如果他们没有“chmod”二进制文件怎么办?您必须下载并将其包含在您的应用程序或资产中。

使用Android NDK + JNI(用户不需要chmod但需要编译好的ndk库):

/**
 * Change file permissions. Eg. chmod 777 FILE.
 * @param e Java environment.
 * @param c Java class.
 * @param file Path to file.
 * @param mode Permissions for the file.
 */
static jint executeCommand(JNIEnv *e, jclass __attribute__((__unused__))c, jstring file, jstring mode) {
    return (chmod(e->GetStringUTFChars(file, 0), strtol(e->GetStringUTFChars(mode, 0), 0, 8)));
}

问题:确保使用 APP_ABI 编译 NDK := all for all devices

对于 Java(7+) + Android API 9+(用户不需要 chmod 或库):

/**
 * Change files to "0777"
 * @param path Path to file
 */
public static void changeFilePermission(final String path) {
    final File file = new File(path);
    file.setReadable(true, false);
    file.setExecutable(true, false);
    file.setWritable(true, false);
}

问题:你的 minSDK 必须是 9!

【讨论】:

  • 啊!为什么我没想到那样执行 chmod!这完全有效!非常感谢贾里德
【解决方案2】:

解决您的问题,您真的在问如何让媒体播放器访问我的应用程序提供的数据?

您已选择将其作为文件传递,因此想知道如何使该文件公开可读。

另一种解决方案是通过 ContentProvider 将数据传递给媒体播放器,这样它就不需要直接访问您的数据。查看FileProvider 了解如何以这种方式包装文件。

【讨论】:

    【解决方案3】:

    我给你一个有趣而简单的解决方案,用于在 Android 系统中更改文件的权限。放代码就行了

    Runtime.getRuntime().exec("chmod 777 <path to file>");
    

    在 UiAutomator 测试用例中。并在您的目标机器上运行该 uiautomator 测试用例!

    参考:http://android-lihao.blogspot.com/2015/08/modify-permissions-of-files-in-android.html

    【讨论】:

      猜你喜欢
      • 2011-06-03
      • 2015-02-13
      • 2023-04-04
      • 2013-08-01
      • 1970-01-01
      • 2013-12-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多