2017-09-05 23 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(); 
     } 

을 그리고 여기 방법입니다

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

다음은 : 그 UI의 버튼을 누르면 내 응용 프로그램에서 WhatsApp에 음성 메모를 재생합니다 (recordingData 객체는 이전 SaveRecording 활동에 저장된 음성 메모 URI와 제목을 포함) 실제 오디오 파일은 파일 시스템의 WhatsApp 폴더에 저장됩니다. 내 앱에서 URI를 MediaPlayer 객체로 전달하여이를 재생하고 있습니다. 내 애플리케이션에서 WhatsApp 음성 메모를 재생할 수있는 이유를 암시되지 않습니다. 암시 적 의도를 통해 URI를 가져온 직후입니다.

일단 응용 프로그램을 닫았다가 다시 열면 URI가 null을 가리키는 것처럼 보입니다. URI가 가리키는 자원이 여전히 존재하기 때문에 그렇게 할 수는 없습니다. 이 문제를 해결하는 방법에 대한 아이디어가 있으십니까?

답변

0

내 응용 프로그램은 다음 WhatsApp에 음성이 암시 적 의도를 통해 사용자가 내 응용 프로그램의 UI에있는 버튼을 누르면 음성 메모를 재생할 수 URI에게 응용 프로그램을 사용하여 URI를 주목 받는다.

Uri으로 식별되는 콘텐츠에 일시적으로 액세스 할 수 있습니다. 나는 (작업 관리자에서) 내 응용 프로그램을 닫은 후 나는 그것을 열면

다시 나는 음성 메모

에게 경과 내용에 대한 임시 액세스를 재생할 더 이상 할 수 없습니다입니다. 그 중에서도 프로세스가 끝나면 액세스 권한을 잃게됩니다.

Uri은 인증 된 웹 서버의 HTTPS URL과 유사하다고 간주하십시오. 사용자의 세션이 만료되면 해당 URL은 쓸모가 없습니다.

어떤 문제를 해결할 수 있습니까?

콘텐츠에 액세스 할 수있는 동안 사용자가 제어하는 ​​일부 파일에 바이트 사본을 만듭니다.

또는 사용자가 다른 앱에서 내 앱으로 콘텐츠를 다시 보도록합니다.

+0

이것은 분명히 도움이됩니다. 이제 어디에서 일해야하는지 알았습니다. 나는 URI에 접근 할 수있는 동안 파일의 복사본을 만들려고 노력할 것이고 문제가 해결되면 알려줄 것이다. 정말 고맙습니다. – Diego

+0

그것은 작동합니다! 고마워. 내가 제안한 바에 따라, 내가 만든 파일에 바이트를 저장 했으므로 필요할 때 콘텐츠에 액세스 할 수있게되었습니다. – Diego