2014-07-23 3 views
2

Android 2.3에서 mp3를 재생하는 응용 프로그램을 실행하는 데 문제가 있습니다. 이 mp3는 원격 서버에서 /data/data/com.my.package.name/으로 다운로드되며 기본 파일 사용 권한은 -rw -------입니다.Android - API 8에서 chmod를 실행하는 방법은 무엇입니까?

내 테스트에 따르면 HONEYCOMB 장치와 달리 미디어 플레이어는 파일 권한이 -rw-rw-rw-가 아닌 경우 mp3를 읽지 않습니다.

필자가 adb 셸을 사용하여 파일 권한을 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); 
} 

을 . 이 코드는 유용 아니다 포스트 벌집 장치에 작동하는 경우

불행하게도,

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

내가 정말 필요 IOException: broken pipe on Android 2.3를 발생시킵니다.

실제로 문제가 chmod에서 발생하는지 또는 실행하는 방법에서 오는 것인지 실제로 알지 못합니다.

파일 권한을 변경하지 않고 HONEYCOMB에서 작동하는 미디어 플레이어를 작동시키는 데 필요한 모든 해결책은 무엇입니까?

+0

없습니다. File 클래스의 setReadable (true, false)를 사용하십시오. –

+0

@ChrisStratton Android API 9+ –

+0

예 Chris, 맞습니다. "su"는 필요하지 않지만 Jared는 setReadable()을 사용할 수 없습니다. – AlainBo

답변

5

아주 좋은 질문입니다. 잠시 후에이 문제가 발생했습니다. (chmod를해야합니다 사용자) 자바 + 안드로이드를 사용

:

를 폴더 :

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

파일 :

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

문제 : 그들은 "chmod를이없는 경우에는 어떻게 "바이너리? 응용 프로그램이나 자산에 다운로드하여 포함시켜야합니다. 안드로이드 NDK + JNI (사용자가 chmod를하지만 필요 컴파일 NDK libs가 필요하지 않습니다)를 사용하여

:

/** 
* 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를 컴파일해야합니다 : = 모든 장치에 대한 모든

자바에 대한 (7+) + 안드로이드 API 9+ (사용자 chmod를 또는 libs가 필요하지 않음) :

/** 
* 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이어야합니다!

+1

arghhh! 왜 내가 그런 chmod를 실행하는 것을 생각하지 않았다! 완벽하게 작동합니다! Jared 많이 고마워. – AlainBo

0

문제를 해결하면 내 응용 프로그램에서 제공하는 데이터에 Media Player에 대한 액세스 권한을 부여 할 수 있습니까?

파일로 전달하도록 선택 했으므로 해당 파일을 공개적으로 읽을 수있게 만드는 방법을 알고 싶습니다.

대체 솔루션은 데이터에 직접 액세스 할 필요가 없도록 ContentProvider를 통해 Media Player로 데이터를 전달하는 것입니다. 이 방법으로 파일을 랩핑하는 방법은 FileProvider을보십시오.

0

Android 시스템에서 파일의 권한을 변경하는 데 재미 있고 간단한 솔루션을 제공합니다. 코드 넣기

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

을 UiAutomator 테스트 케이스에 넣으십시오. 그리고 당신의 목표 머신에서 uiautomator 테스트 케이스를 실행하십시오!

참조 : 파일이 이미 사용자가 소유하고 있기 때문에 이것에 대한 'SU'를 사용하는 이유가 http://android-lihao.blogspot.com/2015/08/modify-permissions-of-files-in-android.html