2017-09-05 3 views
0

Ich entwickle eine Anwendung, die WhatsApp-Sprachnotizen verwaltet. In der WhatsApp-Benutzeroberfläche kann der Benutzer eine Sprachnotiz teilen und dann meine Anwendung als Freigabeoption auswählen. Meine Anwendung erhält dann den WhatsApp-Sprachnotiz-URI über eine implizite Absicht und mithilfe der URI kann die App die Sprachnotiz wiedergeben, wenn der Benutzer auf eine Schaltfläche in der Benutzeroberfläche der Anwendung klickt.Nach dem Schließen und erneutem Öffnen meiner App ist es unmöglich, Audio vom URI abzuspielen.

Das Problem, mit dem ich konfrontiert bin, ist folgendes: direkt nach dem Speichern der Sprachnotiz URI in meiner Anwendung kann ich es spielen, aber wenn ich (in Task-Manager) meine Anwendung schließen und dann öffne ich es wieder ich bin es nicht kann die Sprachnotiz nicht mehr abspielen. Ich mache keine Kopien der Sprachnotizdatei: Ich spiele sie einfach, indem ich ihren URI an die MediaPlayer-Klasse in meiner App übergebe. Der Fehler, den ich bekommen ist:

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) 

Hier ist, wie ich die die WhatsApp Stimme beachten URI von impliziter Absicht erhalten (all dies in der SaveRecording Aktivität erfolgt):

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

Und hier ist, wie ich spielt die WhatsApp Sprachnotiz in meiner Anwendung per Knopf in seiner UI drücken (das recordingData Objekt enthält die Sprachnotiz-URI und Titel in der vorherige SaveRecording Aktivität gespeichert):

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

die a Die Audiodatei wird im WhatsApp-Ordner des Dateisystems gespeichert. Was ich in meiner App tue, ist, es abzuspielen, indem ich seinen URI an ein MediaPlayer-Objekt übergebe. Ich verstehe nicht, warum ich in der Lage bin, die WhatsApp-Sprachnotiz nur direkt nach dem Abrufen der URI über implizite Absicht zu spielen.

Sobald meine Anwendung geschlossen und erneut geöffnet wird, scheint der URI auf Null zu zeigen. Aber es kann nicht so sein, weil die Ressource, auf die der URI zeigt, noch existiert. Irgendwelche Ideen, wie das zu beheben?

Antwort

0

Meine Anwendung empfängt dann die WhatsApp Stimme URI beachten Sie über implizite Absicht und durch die URI der App können Sie die Sprachnotiz wiedergeben, wenn der Benutzer eine Taste drückt in UI meine Anwendung.

Sie haben temporären Zugriff auf den Inhalt, der von Uri identifiziert wird.

wenn ich (in Task-Manager) meine Anwendung zu schließen und ich es dann wieder öffnen, bin ich nicht mehr die Lage, die Sprachnotiz

Ihren temporären Zugriff auf die Inhalte verfallen zu spielen. Unter anderem verlieren Sie Zugriffsrechte, wenn Ihr Prozess endet.

Betrachten Sie die Uri als eine HTTPS URL zu einem authentifizierten Webserver verwandt. Sobald die Benutzersitzung abläuft, ist diese URL nutzlos.

Irgendwelche Ideen, wie das zu beheben?

Während Sie Zugriff auf den Inhalt haben, erstellen Sie eine Kopie der Bytes in einer Datei, die Sie steuern.

Oder lassen Sie den Nutzer den Inhalt erneut von der anderen App an Ihre App senden.

+0

Das hilft definitiv: Jetzt weiß ich, wo ich arbeiten soll. Ich werde versuchen, eine Kopie der Datei zu erstellen, während ich Zugriff auf die URI habe, und dann werde ich Ihnen sagen, ob das Problem gelöst ist. Ich danke dir sehr. – Diego

+0

Es funktioniert! Danke vielmals. Wie Sie vorgeschlagen haben, habe ich die Bytes in einer Datei gespeichert, die ich erstellt habe, und jetzt habe ich Zugriff auf den Inhalt, wenn ich es brauche – Diego

Verwandte Themen