2017-09-05 13 views
0

WhatsApp音声メモを管理するアプリケーションを開発しています。 WhatsApp UIでは、ユーザーは音声メモを共有してから、自分のアプリケーションを共有オプションとして選択できます。 私のアプリケーションは暗黙のインテントでWhatsAppの音声ノートURIを受信し、ユーザーがアプリケーションのUIのボタンを押したときにアプリケーションが音声メモを再生できるURIを使用します。私のアプリケーションを閉じて再開いた後、URIからオーディオを再生することはできません

私が直面している問題は、アプリケーションに音声メモURIを保存した直後に再生することができますが、私のアプリケーションを閉じて(アプリケーションマネージャで)アプリケーションを開いてからもう一度開きますもう音声メモを再生することはできません。 私はボイスノートファイルのコピーを作成していません。私は、アプリケーションのMediaPlayerクラスにそのURIを渡して再生します。私が手にエラーがある:ここでは

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の声を取得する方法である(このすべてはSaveRecording活動で行われている)、暗黙的な意図からURIの点に注意してください。どのように私

//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(); 
     } 

そしてここにはあります

//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."); 
        } 
       }); 
      } 
     }); 

A:そのUIのボタンを押すことにより、自分のアプリケーションでのWhatsAppの音声メモを再生する(recordingDataオブジェクトは、以前のSaveRecording活動に保存された音声メモURIとタイトルが含まれています)実際のオーディオファイルは、ファイルシステム上のWhatsAppフォルダに格納されます。私のアプリでは、そのURIをMediaPlayerオブジェクトに渡して再生しています。 暗黙のインテントでURIを取得した直後に、私のアプリケーションでWhatsApp音声メモを再生できるのはなぜですか?

私のアプリケーションが閉じられ、再度開くと、URIがnullを指しているようです。しかし、URIが指すリソースがまだ存在するため、そうすることはできません。 これを修正する方法はありますか?

答えて

0

私のアプリケーションは暗黙的なインテントでWhatsAppの音声ノートURIを受信し、ユーザーがアプリケーションのUIのボタンを押したときにアプリケーションが音声メモを再生できるURIを使用します。

あなたはUriで識別されるコンテンツに一時的にアクセスできます。

音声メモを再生するにはもう、私は(タスクマネージャで)自分のアプリケーションを閉じてから、私は再びそれを開き、私はできませんよ場合

経過したコンテンツへのあなたの一時的なアクセス。プロセスの終了時にアクセス権を失うことがあります。

Uriは、認証されたWebサーバーへのHTTPS URLと似ていると考えてください。ユーザーのセッションが終了すると、そのURLは役に立たなくなります。

これを解決する方法はありますか?

コンテンツにアクセスしている間は、自分が制御しているファイルにそのバイトのコピーを作成します。

または、ユーザーにもう1つのアプリからコンテンツをもう一度アプリに送信させてもらいます。

+0

これは間違いなく役立ちます:今どこで働くか分かります。私はURIにアクセスしている間にファイルのコピーを作成しようとしますが、問題が解決すれば教えてくれます。どうもありがとうございます。 – Diego

+0

それは動作します!どうもありがとう。あなたが提案したように、私は作成したファイルにバイトを保存しました。今は必要なときにコンテンツにアクセスできます – Diego