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가 가리키는 자원이 여전히 존재하기 때문에 그렇게 할 수는 없습니다. 이 문제를 해결하는 방법에 대한 아이디어가 있으십니까?
이것은 분명히 도움이됩니다. 이제 어디에서 일해야하는지 알았습니다. 나는 URI에 접근 할 수있는 동안 파일의 복사본을 만들려고 노력할 것이고 문제가 해결되면 알려줄 것이다. 정말 고맙습니다. – Diego
그것은 작동합니다! 고마워. 내가 제안한 바에 따라, 내가 만든 파일에 바이트를 저장 했으므로 필요할 때 콘텐츠에 액세스 할 수있게되었습니다. – Diego