2017-09-05 42 views
0

我正在开发管理WhatsApp语音笔记的应用程序。 在WhatsApp UI中,用户可以共享语音笔记,然后选择我的应用程序作为共享选项。 然后,我的应用程序通过隐式意图接收WhatsApp语音提示URI,并通过使用应用程序可以在用户按下应用程序UI中的按钮时播放语音​​提示的URI。关闭并重新打开我的应用后,无法播放来自URI的音频

我面临的问题如下:在我的应用程序中保存语音注释URI后,我可以播放它,但如果我关闭(在任务管理器中)我的应用程序,然后再次打开它,我不是再也无法播放语音记事。 我没有制作任何语音备忘录文件的副本:我只是通过将URI传递给我的应用中的MediaPlayer类来播放它。我得到的错误是:

09-05 18:11:47.532 10160-10160/? E/AndroidRuntime: FATAL EXCEPTION: main 
               Process: com.id12401446.audios, PID: 10160 
               java.lang.NullPointerException: Attempt to invoke virtual method 'void android.media.MediaPlayer.start()' on a null object reference 
                at com.id12401446.audios.fragments.DefaultPlaylistFragment$DefaultPlaylistAdapter$2.onClick(DefaultPlaylistFragment.java:174) 
                at android.view.View.performClick(View.java:6199) 
                at android.widget.TextView.performClick(TextView.java:11090) 
                at android.view.View$PerformClick.run(View.java:23647) 
                at android.os.Handler.handleCallback(Handler.java:751) 
                at android.os.Handler.dispatchMessage(Handler.java:95) 
                at android.os.Looper.loop(Looper.java:154) 
                at android.app.ActivityThread.main(ActivityThread.java:6682) 
                at java.lang.reflect.Method.invoke(Native Method) 
                at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1520) 
                at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1410) 

这里是我得到的WhatsApp的语音注意,从隐性意图URI(这一切都是在SaveRecording活动完成):

//Handling external audio intents that can start this activity 
    Intent intent = this.getIntent(); 
    String action = intent.getAction(); 
    String type = intent.getType(); 
    if (action != null && action.equals(Intent.ACTION_SEND) && type != null) { 
     if (type.startsWith("audio/")) { 

      //getExternalRecording(intent); 
      Uri uriFromExternalIntent = (Uri) intent.getParcelableExtra(Intent.EXTRA_STREAM); 
      Log.d(TAG, "mRecording uri got from external intent is: " + uriFromExternalIntent); 
      this.mRecordingUriString = uriFromExternalIntent.toString(); 
     } 

这里是我如何在它的UI按下一个按钮,在我的应用程序播放WhatsApp的语音备忘录(在recordingData对象包含语音记事URI和标题保存在前面SaveRecording活动):

//Adding ClickListener for the play button 
     rowPlayButton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 


       String recordingUriString = recordingData.getURI(); 
       Uri recordingUri = Uri.parse(recordingUriString); 

       Log.d("MAD", "URI of the currently playing audio is: " + recordingUriString); 

       //Creating a new MediaPlayer object to play the recording 
       MediaPlayer mediaPlayer = new MediaPlayer(); 
       try { 
        Log.d(TAG,"Trying to set audio stream..."); 
        mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); 
        Log.d(TAG, "Audio stream set successfully"); 
        Log.d(TAG, "Trying to set data source..."); 
        mediaPlayer.setDataSource(getContext(), recordingUri); 
        Log.d(TAG, "Data source set successfully: preparing MediaPlayer..."); 
        mediaPlayer.prepare(); 
        Log.d(TAG, "MediaPlayer prepared successfully: starting playback..."); 
        mediaPlayer.start(); 
       } catch (IOException e) { 
        Log.e("MAD", "Error while trying to play data from uri: " + recordingUri); 
        Toast.makeText(getContext(), "Error playing data from uri: " + recordingUri, Toast.LENGTH_LONG).show(); 
        e.printStackTrace(); 
       } 
       mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { 
        @Override 
        public void onCompletion(MediaPlayer mediaPlayer) { 
         mediaPlayer.release(); 
         mediaPlayer = null; 
         Log.d(TAG,"mediaPlayer released and nullified."); 
        } 
       }); 
      } 
     }); 

的一个实际音频文件存储在文件系统的WhatsApp文件夹中。我在我的应用中做的是通过将URI传递给MediaPlayer对象来播放它。 我不明白为什么我只能在通过隐式意图获取URI后才能在应用程序中播放WhatsApp语音记事。

一旦我的应用程序关闭并重新打开,URI似乎指向null。但它不可能如此,因为URI指向的资源依然存在。 任何想法如何解决这个问题?

回答

0

然后,我的应用程序通过隐式意图并通过使用URI在应用程序的用户界面中按下按钮时应用程序可以播放语音注释的URI来接收WhatsApp语音注释URI。

您必须由Uri识别的内容临时访问。

如果我关闭(在任务管理器),我的应用程序,然后我打开它再次我不能再播放语音备忘

您对失效的内容临时访问。在其他时候,当您的流程结束时,您将失去访问权限。

考虑将Uri类似于通过身份验证的Web服务器的HTTPS URL。一旦用户的会话过期,该URL就没用了。

任何想法如何解决这个问题?

虽然您有权访问该内容,请将字节复制到您控制的某个文件。

或者,让用户再次将内容从其他应用程序发送到您的应用程序。

+0

这绝对有帮助:现在我知道在哪里工作。我会尝试在访问URI的同时复制文件,然后告诉你问题是否已解决。非常感谢。 – Diego

+0

它的工作原理!非常感谢。正如你所建议的那样,我将这些字节存储在我创建的文件中,现在我可以在需要时访问这些内容 – Diego

相关问题