Nexus 7 Не удалось открыть файл. Доступ запрещен

Только что получил свой Nexus 7, и когда я проигрываю аудиофайл, я получаю эту ошибку, а затем принудительно закрываю. Я весь день искал решение. Вот соответствующий код:

protected void onListItemClick(ListView l, View v, int position, long id) {
playSong(MEDIA_PATH + songs.get(position));
    textViewRecordPlaying.setText(songs.get(position));
}

private void playSong(String songPath) {
   final Intent i = new Intent(MusicService.ACTION_URL);
   File file = new File(songPath);
   Uri uri = Uri.fromFile(file);
   i.setData(uri);
   startService(i);

   }

playSong(MEDIA_PATH + songs.get(position));

My MEDIA_PATH:

private static final String MEDIA_PATH = new String(Environment
      .getExternalStorageDirectory().getPath() + "/AudioStreamRecorder/");

Этот код прекрасно работает на моем Galaxy S3 и Thunderbolt, но когда я нажимаю на элемент списка, я получаю ошибку Failed to open file. Permission denied. на Nexus 7 и Asus Transformer Prime TF201, а затем закрываю принудительно.

Я пробовал Environment.getExternalStorageDirectory(); и Environment.getExternalStorageDirectory()getAbsolutePath(); с теми же ошибками. Я объявил <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> и <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> Кто-нибудь, пожалуйста, помогите, у меня закончились идеи...

05-07 16:47:35.714: I/Streaming Radio Recorder Pro(4427): debug: Creating service
05-07 16:47:35.724: I/MusicRetriever(4427): Querying media...
05-07 16:47:35.724: I/MusicRetriever(4427): URI: content://media/external/audio/media
05-07 16:47:35.724: I/Streaming Radio Recorder Pro(4427): Playing from URL/path: file:///storage/emulated/0/AudioStreamRecorder/The%20Dining%20Rooms%20-%20triste%2C%20solitario%20y%20final-3.54.44%20Tuesday%2C%20May%207%2C%202013.mp3
05-07 16:47:35.724: I/AudioService(436):  AudioFocus  requestAudioFocus() from android.media.AudioManager@42ffe928com.LudwigAppDesign.streamingradioplayerpro.AudioFocusHelper@42ffe2b8
05-07 16:47:35.724: I/AwesomePlayer(128): setDataSource_l(URL suppressed)
05-07 16:47:35.724: I/MusicRetriever(4427): Query finished. Returned a cursor.
05-07 16:47:35.724: I/MusicRetriever(4427): Listing...
05-07 16:47:35.724: I/MusicRetriever(4427): Title column index: 8
05-07 16:47:35.724: I/MusicRetriever(4427): ID column index: 8
05-07 16:47:35.724: I/MusicRetriever(4427): ID: 21 Title: Join Hangout
05-07 16:47:35.724: I/MusicRetriever(4427): ID: 2305 Title: The Dining Rooms - triste, solitario y final-3.54.44 Tuesday, May 7, 2013
05-07 16:47:35.724: I/MusicRetriever(4427): Done querying media. MusicRetriever is ready.
05-07 16:47:35.734: E/(128): Failed to open file '/storage/emulated/0/AudioStreamRecorder/The Dining Rooms - triste, solitario y final-3.54.44 Tuesday, May 7, 2013.mp3'. (Permission denied)
05-07 16:47:35.734: E/MediaPlayer(4427): error (1, -2147483648)
05-07 16:47:35.734: E/MediaPlayer(4427): Error (1,-2147483648)
05-07 16:47:35.734: E/Streaming Radio Recorder Pro(4427): Error: what=1, extra=-2147483648
05-07 16:47:35.764: I/AudioService(436):  AudioFocus  abandonAudioFocus() from android.media.AudioManager@42ffe928com.LudwigAppDesign.streamingradioplayerpro.AudioFocusHelper@42ffe2b8
05-07 16:47:36.704: D/AndroidRuntime(4427): Shutting down VM
05-07 16:47:36.704: W/dalvikvm(4427): threadid=1: thread exiting with uncaught exception (group=0x41f66930)
05-07 16:47:36.714: E/AndroidRuntime(4427): FATAL EXCEPTION: main
05-07 16:47:36.714: E/AndroidRuntime(4427): java.lang.NullPointerException
05-07 16:47:36.714: E/AndroidRuntime(4427):     at com.LudwigAppDesign.streamingradioplayerpro.Songs$8.run(Songs.java:407)
05-07 16:47:36.714: E/AndroidRuntime(4427):     at android.os.Handler.handleCallback(Handler.java:725)
05-07 16:47:36.714: E/AndroidRuntime(4427):     at android.os.Handler.dispatchMessage(Handler.java:92)
05-07 16:47:36.714: E/AndroidRuntime(4427):     at android.os.Looper.loop(Looper.java:137)
05-07 16:47:36.714: E/AndroidRuntime(4427):     at android.app.ActivityThread.main(ActivityThread.java:5041)
05-07 16:47:36.714: E/AndroidRuntime(4427):     at java.lang.reflect.Method.invokeNative(Native Method)
05-07 16:47:36.714: E/AndroidRuntime(4427):     at java.lang.reflect.Method.invoke(Method.java:511)
05-07 16:47:36.714: E/AndroidRuntime(4427):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
05-07 16:47:36.714: E/AndroidRuntime(4427):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
05-07 16:47:36.714: E/AndroidRuntime(4427):     at dalvik.system.NativeStart.main(Native Method)
05-07 16:47:36.724: W/ActivityManager(436):   Force finishing activity com.LudwigAppDesign.streamingradioplayerpro/.Songs
05-07 16:47:36.784: D/dalvikvm(436): GC_FOR_ALLOC freed 3517K, 29% free 17724K/24840K, paused 57ms, total 57ms
05-07 16:47:37.294: W/ActivityManager(436): Activity pause timeout for ActivityRecord{42c1cd18 u0 com.LudwigAppDesign.streamingradioplayerpro/.Songs}
05-07 16:47:46.794: W/ActivityManager(436): Launch timeout has expired, giving up wake lock!
05-07 16:47:47.304: W/ActivityManager(436): Activity idle timeout for ActivityRecord{42b7ced0 u0 com.LudwigAppDesign.streamingradioplayerpro/.Main}
05-07 16:48:05.824: W/ThrottleService(436): unable to find stats for iface rmnet0

Я исключил это из метода playSong... вызывает ли это исключение NullPoingterException?

Handler handler = new Handler();
    handler.postDelayed(new Runnable() {
        public void run() {

            MusicService.mPlayer
                    .setOnCompletionListener(new OnCompletionListener() {
                        public void onCompletion(MediaPlayer arg0) {
                            nextSong();
                        }
                    });
        }
    }, 1000);

}

private void nextSong() {
    if (++currentPosition >= songs.size()) {    
        currentPosition = 0;
    } else {
        // Play next song
        playSong(MEDIA_PATH + songs.get(currentPosition));
        textViewRecordPlaying.setText(songs.get(currentPosition));
        SharedPreferences settings = getSharedPreferences(
                RECORDINGS_NOW_PLAYING, 0);
        SharedPreferences.Editor editor = settings.edit();
        editor.putString("nowPlayingTitle", (songs.get(currentPosition).toString().trim()));
        // Commit the edits!
        editor.commit();
    }
}

РЕДАКТИРОВАТЬ --- Привет, я удалил этот код, и исключение NullPointerException исчезло:

Handler handler = new Handler();
    handler.postDelayed(new Runnable() {
        public void run() {

            MusicService.mPlayer
                    .setOnCompletionListener(new OnCompletionListener() {
                        public void onCompletion(MediaPlayer arg0) {
                            nextSong();
                        }
                    });
        }
    }, 1000);

Теперь я просто остался с исходной ошибкой Permission Denied:

05-08 12:23:26.838: I/Streaming Radio Recorder Pro(2661): Playing from URL/path: file:///storage/emulated/0/AudioStreamRecorder/Goudron%20-%20Art%20School%20Fuckheads-5.55.51%20Tuesday%2C%20May%207%2C%202013.mp3
05-08 12:23:26.838: I/AudioService(482):  AudioFocus  requestAudioFocus() from android.media.AudioManager@41cfdfd0com.LudwigAppDesign.streamingradioplayerpro.AudioFocusHelper@41cfdaf8
05-08 12:23:26.848: I/AwesomePlayer(128): setDataSource_l(URL suppressed)
05-08 12:23:26.848: I/MusicRetriever(2661): Querying media...
05-08 12:23:26.858: I/MusicRetriever(2661): URI: content://media/external/audio/media
05-08 12:23:26.858: E/(128): Failed to open file '/storage/emulated/0/AudioStreamRecorder/Goudron - Art School Fuckheads-5.55.51 Tuesday, May 7, 2013.mp3'. (Permission denied)
05-08 12:23:26.858: E/MediaPlayer(2661): error (1, -2147483648)
05-08 12:23:26.858: E/MediaPlayer(2661): Error (1,-2147483648)
05-08 12:23:26.898: D/dalvikvm(584): GC_CONCURRENT freed 518K, 7% free 9075K/9736K, paused 3ms+3ms, total 32ms
05-08 12:23:26.898: E/Streaming Radio Recorder Pro(2661): Error: what=1, extra=-2147483648
05-08 12:23:26.928: I/AudioService(482):  AudioFocus  abandonAudioFocus() from android.media.AudioManager@41cfdfd0com.LudwigAppDesign.streamingradioplayerpro.AudioFocusHelper@41cfdaf8
05-08 12:23:26.928: I/MusicRetriever(2661): Query finished. Returned a cursor.
05-08 12:23:26.928: I/MusicRetriever(2661): Listing...
05-08 12:23:26.928: I/MusicRetriever(2661): Title column index: 8
05-08 12:23:26.928: I/MusicRetriever(2661): ID column index: 8
05-08 12:23:26.928: I/MusicRetriever(2661): ID: 21 Title: Join Hangout
05-08 12:23:26.928: I/MusicRetriever(2661): ID: 1553 Title: Goudron - Art School Fuckheads-5.55.51 Tuesday, May 7, 2013
05-08 12:23:26.928: I/MusicRetriever(2661): ID: 1694 Title: Lusine Icl - Mod-10.47.59 Tuesday, May 7, 2013
05-08 12:23:26.928: I/MusicRetriever(2661): Done querying media. MusicRetriever is ready.

Я надеюсь, что это поможет... дайте мне знать, если вам нужна дополнительная информация, и спасибо за попытку.


person midiwriter    schedule 07.05.2013    source источник
comment
Попробуйте поместить фиктивный текстовый файл во внешнее хранилище и посмотрите, сможете ли вы прочитать его из кода. Возможно, также попробуйте передать путь к файлу с вашим намерением и получить uri на стороне службы. Я не понимаю, почему это что-то изменит, но попытка не помешает.   -  person FoamyGuy    schedule 08.05.2013
comment
Никогда не создавайте путь к файлу с помощью конкатенации строк. Пожалуйста, используйте правильный конструктор File. Кроме того, пожалуйста, опубликуйте всю трассировку стека.   -  person CommonsWare    schedule 08.05.2013
comment
Как правильно выполнить трассировку стека?   -  person midiwriter    schedule 08.05.2013


Ответы (2)


Nexus 7 Не удалось открыть файл. Доступ запрещен

Это не то, на что указывает ваша трассировка стека. Ваша ошибка в трассировке стека:

05-07 16:47:36.714: E/AndroidRuntime(4427): java.lang.NullPointerException
05-07 16:47:36.714: E/AndroidRuntime(4427):     at com.LudwigAppDesign.streamingradioplayerpro.Songs$8.run(Songs.java:407)

Поскольку у нас нет метода run() в исходном коде, который вы указали выше, вам трудно помочь.

person CommonsWare    schedule 07.05.2013
comment
У меня есть метод playSong в элементе списка. Я пропустил что-то еще? Кроме того, разве исключение NullPointerException не является результатом отказа в разрешении, поскольку оно все еще пытается запуститься? - person midiwriter; 08.05.2013
comment
@MikeLudwig: Я что-то еще упустил? -- NullPointerException исходит из метода run() в каком-то анонимном внутреннем классе. Кроме того, разве исключение NullPointerException не является результатом отказа в разрешении, поскольку оно все еще пытается запуститься? -- у нас нет возможности ответить на этот вопрос, тем более что мы понятия не имеем, что пытается сделать этот run() метод. - person CommonsWare; 08.05.2013
comment
@MikeLudwig: Похоже, вы не инициализировали mPlayer. Это единственное, что я вижу в этом run(), что может вызвать NullPointerException. - person CommonsWare; 08.05.2013
comment
Просто интересно, почему он работает на некоторых устройствах, а не на планшетах. - person midiwriter; 08.05.2013
comment
Я все еще ищу решение этой проблемы... похоже, много вопросов без ответа относительно Android 4.2 и невозможности открывать файлы во внутренней памяти... - person midiwriter; 08.05.2013
comment
@MikeLudwig: похоже, есть много вопросов, оставшихся без ответа, относительно Android 4.2 и невозможности открывать файлы во внутренней памяти - вы не работаете с внутренней памятью. Вы работаете с внешним хранилищем. Я понятия не имею, сколько вопросов осталось без ответа, потому что вы не связались с ними. Кроме того, я не могу помочь вам определить, почему mPlayer не инициализирован, потому что из нескольких фрагментов кода, показанных здесь, вы даже не пытаетесь его инициализировать, предполагая, что этот код не входит в ваш вопрос. - person CommonsWare; 08.05.2013
comment
Привет, я добавил больше правок, и NullPointerException больше нет... спасибо. - person midiwriter; 08.05.2013
comment
Файл пытается открыть из /storage/emulated/0/AudioStreamRecorder. Когда я использую ES File Explorer, путь /sdcard/AudioStreamRecorder. У меня такое чувство, что ошибка возникает из-за этого, но я понятия не имею, как ее исправить... Я использую new String(Environment.getExternalStorageDirectory().getPath() + "/AudioStreamRecorder/", чтобы получить свой путь. Это правильно на 4.2.2? - person midiwriter; 08.05.2013
comment
@MikeLudwig: Ну, вы используете конкатенацию, как я уже указывал ранее, как неидеальную. /sdcard — это символическая ссылка, указывающая куда-то еще, а /storage/emulated/0, безусловно, является возможным пунктом назначения. Кроме того, единственное, что я могу придумать, это попробовать имя файла без пробелов. - person CommonsWare; 09.05.2013
comment
Нет, это не помогло удалить пробелы. Файл есть, потому что у меня есть TextView, который читает имя/местоположение файла, и это правильно, и файл воспроизводится в других программах. Что-то в 4.2 не нравится, как я пытаюсь получить доступ к файлу, и мне просто нужно выяснить, что это такое (даже работает на 4.1 и ниже). - person midiwriter; 09.05.2013
comment
@MikeLudwig: Если вы можете создать воспроизводимый тестовый пример - проект, а также инструкции о том, как использовать этот проект для воспроизведения вашей ошибки - я хотел бы взглянуть на него. - person CommonsWare; 09.05.2013
comment
Хорошо, я сделаю это позже, когда у меня будет время. Спасибо. - person midiwriter; 09.05.2013
comment
А пока вот сообщение, которое я просматриваю: [ссылка]stackoverflow.com/questions/13661877/ - person midiwriter; 09.05.2013
comment
@MikeLudwig: Многопользовательские возможности Android 4.2+ означают, что вы можете получить доступ только к внешнему хранилищу текущего пользователя. Путь к внешнему хранилищу пользователя А будет недоступен из учетной записи пользователя Б. Но вам придется немного постараться, чтобы получить путь A к вашему приложению при работе от имени B. Вот почему важен воспроизводимый тестовый пример, чтобы мы могли определить, в чем проблема — в Android или в поведении сам тестовый код. - person CommonsWare; 09.05.2013
comment
большое спасибо. Следующие два дня я очень загружен работой, но я постараюсь сообщить об этом как можно скорее. Спасибо еще раз - person midiwriter; 09.05.2013

4.2 добавлены профили, и кажется, что MediaPlayer никогда не обновлялся, чтобы правильно обрабатывать это.

получите FileDescriptor для вашего URL-адреса и воспроизведите его, и проблема должна исчезнуть. Заметил это после 2 недель разработки на моем SGSII, а затем переключился на Nexus 7.

setDataSource(new FileInputStream(url).getFD());

person Ruxton    schedule 17.05.2013
comment
Привет, спасибо за ответ. Если бы вы могли помочь, как бы я сделал это, используя намерение? Вот мой код: final Intent i = new Intent(MusicService.ACTION_URL); File file = new File(songPath); Uri uri = Uri.fromFile(file); i.setData(uri); startService(i); Должно быть, здесь проблема, так как я могу воспроизвести тот же файл, если использую MediaPlayer напрямую без Intent. - person midiwriter; 18.05.2013
comment
что-то внутри MusicService вызывает вашу проблему, как вы устанавливаете uri внутри MusicService? - person Ruxton; 30.05.2013