2015-04-30 3 views
3

я пишу файл во внутренней памяти:Мое приложение может создать файл, но не может читать его

byte[] data = ... // (A buffer containing wav data) 
String filename = context.getFilesDir().getAbsolutePath() + "/newout.wav"; 
File file = new File(filename); 
FileOutputStream fos = new FileOutputStream(file); 
fos.write(data); 
fos.close(); 

Тогда я пытаюсь играть:

MediaPlayer player = new MediaPlayer(); 
player.setDataSource(filename); 
player.prepare(); 
player.setLooping(false); 
player.start(); 

Но prepare() терпит неудачу:

java.io.IOException: Prepare failed.: status=0x1 

Я проверил файл и увидел, что это разрешение -rw-------. Я изменил его на -rw-r--r--, после чего он успешно играл.

Так как же мое приложение может написать файл, но не может его прочитать? И как я могу сделать FileOutputStream для установки прав доступа?

+0

У вас есть это разрешение: в AndroidManifest.xml? –

+0

Я думаю, что вы пишете файл во внутренней памяти, пожалуйста, проверьте путь –

+0

Он находится во внутренней памяти: '/ data/data/xx.xxx.xxx/files/newout.wav' – Mousa

ответ

2

Чтобы изменить programaticaly права доступа к файлам на -rw-р - r-- вам нужно сделать smoething так:

Process process = null; 
DataOutputStream dataOutputStream = null; 

try { 
    process = Runtime.getRuntime().exec("su"); 
    dataOutputStream = new DataOutputStream(process.getOutputStream()); 
    dataOutputStream.writeBytes("chmod 644 FilePath\n"); 
    dataOutputStream.writeBytes("exit\n"); 
    dataOutputStream.flush(); 
    process.waitFor(); 
} catch (Exception e) { 
    return false; 
} finally { 
    try { 
     if (dataOutputStream != null) { 
      dataOutputStream.close(); 
     } 
     process.destroy(); 
    } catch (Exception e) { 
     System.out.println(e.getMessage()); 
    } 
} 
+0

Хорошо, это помогает, но, судя по использованию 'su', ему нужны привилегии root, не так ли? – Mousa

+0

да, вам нужно иметь разрешения администратора на вашем компьютере –

+1

Ну, я использовал этот подход, но поскольку у меня есть этот файл, мне даже не нужно 'su'! – Mousa

1

Если открыть файл, режим по умолчанию Context.MODE_PRIVATE, например, как в

File file = new File(context.getFilesDir(), filename); 

String filename = "myfile"; 
String string = "Hello world!"; 
FileOutputStream outputStream; 

try { 
    outputStream = openFileOutput(filename, Context.MODE_PRIVATE); 
    outputStream.write(string.getBytes()); 
    outputStream.close(); 

} catch (Exception e) { 
    e.printStackTrace(); 
} 

(снято с the documentation). Режимы MODE_WORLD_READABLE и MODE_WORLD_WRITABLE устарели и не работают на новых устройствах. Поэтому я бы сказал, что вы должны писать на внешнем хранилище, чтобы сделать контент доступным для других приложений.

Примечание: согласно documentation:

Внешнее запоминающее устройство: «Это мир считываемый, поэтому файлы, сохраненные здесь можно прочитать вне вашего контроля»

+0

Я не пытаюсь сделать его доступным для других приложений! Запись и чтение происходит в одном приложении. – Mousa

+0

, изменяющийся на 'MODE_WORLD_READABLE', сделал его доступным для чтения, но мне интересно, почему' rw ------- 'недостаточно, когда он находится в одном приложении? – Mousa

+0

Насколько я помню, все приложения запускаются как их собственный пользователь, а упомянутые выше разрешения позволяют только вашему приложению писать и читать. Однако _MediaPlayer_ является частью другого приложения, работающего как другой пользователь, который не имеет прав доступа по умолчанию. После того как вы расширили разрешение на '-rw-r-r -', все пользователи имеют право читать (включая системы _MediaPlayer_) ** p.s.: ** позаботьтесь с 'MODE_WORLD_READABLE' - он может не всегда работать – Trinimon

Смежные вопросы