-2

在我的應用程序中,我在播放音頻的同時播放音頻文件,如果點擊後退按鈕,我的應用程序會崩潰。我嘗試過應用stop(),release(),reset()和其他媒體播放器功能。當在android中按下後退按鈕時,媒體播放器崩潰應用程序片段

的logcat:

11-30 16:09:09.473 2270-2468/? E/SEC_DRM_PLUGIN_Omafl: OmaPlugin::onOpenDecryptSession(fd)::Drm2IsDrmFileByExtFd::file is NOT DRM by extension 
11-30 16:09:09.473 2270-2468/? E/PrGenericPlugin: PrGenericPlugin::onOpenDecryptSession() onCanHandle error 
11-30 16:09:09.478 8675-8761/? E/MediaPlayer: Should have subtitle controller already set 
11-30 16:09:09.478 2271-2271/? E/MediaPlayerService: WFD client is not created 
11-30 16:09:09.478 2271-2271/? E/MediaPlayerService: offset error 
11-30 16:09:09.478 8675-8761/? E/MediaPlayer: Unable to create media player 
11-30 16:09:09.483 8675-8761/? E/MediaPlayer: stop called in state 1 
11-30 16:09:09.483 8675-8761/? E/MediaPlayer: error (-38, 0) 
11-30 16:09:09.483 8675-8761/? E/MediaPlayer: Should have subtitle controller already set 
11-30 16:09:09.488 2271-8776/? E/OMXNodeInstance: getParameter(133:SEC.mp3.dec, ??(0x7f010008)) ERROR: UnsupportedIndex(0x8000101a) 
11-30 16:09:21.548 2912-3282/? E/Watchdog: [email protected] 9745 [11-30 16:09:21.553] 

代碼

public class DetailPageFragment extends Fragment implements OnCompletionListener,MediaPlayer.OnErrorListener { 
    MediaPlayer mediaPlayer; 
    public OnDetailPageLoadListener mListener; 
    public Boolean isLoaded = false; 
    String idToPass; 
    String buttonToPass; 
    public int headCellHeight; 
    public String headword; 
    public String hwdID; 
    public String homNum; 
    public String senseNum; 
    Thread displayThread; 
    Handler handler; 
    public boolean thesRedirect; 
    public boolean sendBack; 
    public String imageName; 
    ProgressBar pb_detail; 
    Tracker t; 
    public int scrollYpostion; 
    public static final String PREFS_NAME = "LDOCE6PrefsFile"; 
    boolean isRedirected; 

    @Override 
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 
     View v = inflater.inflate(R.layout.activity_detail_page_fragment, null); 

     return v; 

    } 

    @Override 
    public void onAttach(Activity activity) { 
     super.onAttach(activity); 
     try { 
      mListener = (OnDetailPageLoadListener) activity; 
     } catch (ClassCastException e) { 
      throw new ClassCastException(activity.toString() 
        + " must implement OnFragmentInteractionListener"); 
     } 
     // Get the Tracker and Initialise it 
     t = ((LDOCEApp) getActivity().getApplication()).getTracker(
       LDOCEApp.TrackerName.APP_TRACKER); 
     t.setScreenName("Word Description Page"); 
     t.send(new HitBuilders.AppViewBuilder().build()); 
    } 

    @Override 
    public void onActivityCreated(@Nullable Bundle savedInstanceState) { 
     super.onActivityCreated(savedInstanceState); 

      try { 
       imageName = getImageDetailFromDB(headword); 
      } catch (JSONException e) { 
       e.printStackTrace(); 
      } 

     pb_detail = (ProgressBar) getActivity().findViewById(R.id.pb_detail); 
     pb_detail.getIndeterminateDrawable().setColorFilter(Color.rgb(103, 144, 177), Mode.MULTIPLY); 
     final WebView webView = (WebView) getActivity().findViewById(R.id.wv_headCell); 
     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { 
      WebView.setWebContentsDebuggingEnabled(true); 
     } 
     if (webView != null) { 
      webView.getSettings().setJavaScriptEnabled(true); 
      webView.addJavascriptInterface(new JavaScriptInterface(getResources(), getActivity(), this), "JavaScriptInterface"); 
      webView.setWebViewClient(new myWebClient()); 
      WebSettings webViewSettings = webView.getSettings(); 
      SharedPreferences fontSizePreferences = getActivity().getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE); 
      int fontSizeValue = fontSizePreferences.getInt("FONT_VALUE", 0); 
      if (fontSizeValue==0) 
       webViewSettings.setTextZoom(webViewSettings.getTextZoom()+1); 
      if (fontSizeValue==2) 
       webViewSettings.setTextZoom(webViewSettings.getTextZoom()+3); 
      if (fontSizeValue==4) 
       webViewSettings.setTextZoom(webViewSettings.getTextZoom()+7); 
      if (fontSizeValue==8) 
       webViewSettings.setTextZoom(webViewSettings.getTextZoom()+15); 
     } 

     // Handler to Update the UI 
     handler = new Handler() { 
      @Override 
      public void handleMessage(Message msg) { 
       super.handleMessage(msg); 

       try { 
        //Update the History Table for current tapped word - ordering the History Table 
        updateHistoryTable(headword,hwdID); 
        //checks whether Detail Page is still in Loading state or not 
        isLoaded = true; 
         if (webView!=null) { 
          String msgToLoad=String.valueOf(msg.obj); 
          if(String.valueOf(msg.obj).contains("<expandHWD/>")){ 
           System.out.println("Replace the String"); 
           String hwd=headword; 
           if(hwd!=null){ 
            msgToLoad=msgToLoad.replaceAll("<expandHWD/>",hwd+" "); 
           } 
          } 
          //putting the homnum and sense value value 
          if(String.valueOf(msg.obj).contains("replaceHomnum") && !isRedirected){ 
           msgToLoad=msgToLoad.replace("replaceHomnum",homNum); 
           isRedirected=true; 
          } 
          if(String.valueOf(msg.obj).contains("replaceSensenum")){ 
           msgToLoad=msgToLoad.replace("replaceSensenum",senseNum); 
          } 
          if(String.valueOf(msg.obj).contains("replaceId")){ 
           msgToLoad=msgToLoad.replace("replaceId",""); 
          } 
          //replaceImageDetails 
          if(String.valueOf(msg.obj).contains("replaceImageDetails")){ 
           msgToLoad=msgToLoad.replace("replaceImageDetails",imageName); 
          } 
          if(thesRedirect) { 
           //while Loading - check this ia tablet 
           // If this is tablet - we have to calculate the Headcell height to show thesaurus content 
           if(Utils.isTablet(getActivity())) { 
            //check in mastexsltablet - for a variable ThesNotTapped 
            if (String.valueOf(msg.obj).contains("ThesNotTapped")) { 
             msgToLoad = msgToLoad.replace("ThesNotTapped", "ThesTapped"); 
             msgToLoad = msgToLoad.replace("thesHeadwrdId", hwdID); 
            } 
           } 
          } 
          webView.loadDataWithBaseURL("file:///android_asset/www/", msgToLoad, "text/html", "UTF-8", null); 
          webView.setScrollY(scrollYpostion); 
         } 


       } catch (NullPointerException e) { 
        e.printStackTrace(); 
        Log.e("DetailPage", "Page didn't load fully and error is " + e.getMessage()); 

       } 

      } 
     }; 

     //Create a separate Thread for content to display in detail page - This will run in Background Process,without blocking UI 
     displayThread = new Thread(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        String contentsToDisplay = null; 
        contentsToDisplay = displayInfo(); 
        Message msg = new Message(); 
        msg.obj = contentsToDisplay; 
        if (contentsToDisplay != null) { 
         handler.sendMessage(msg); 
        } 
       } catch (Throwable t) { 
        Log.v("Content Display Thread", "Thread Exception" + t); 
        mListener.detailPageInterrupted(true); 
       } 
      } 
     }); 

     displayThread.start(); 
     mListener.detailPageLoaded(true); 
     //Check if it is phone - navigate to AdditionalInfo - default for phone headcellheight is 0and thesaurus ItemId is 1004 
     if(!Utils.isTablet(getActivity()) && (thesRedirect)){ 
      navigateToAdditionalInfo(hwdID,0,1004); 
      thesRedirect=false; 
     } 
    } 

    public class myWebClient extends WebViewClient { 
     @Override 
     public void onPageStarted(WebView view, String url, Bitmap favicon) { 
      // TODO Auto-generated method stub 
      super.onPageStarted(view, url, favicon); 
     } 

     @Override 
     public void onPageFinished(WebView view, String url) { 
      // TODO Auto-generated method stub 
      super.onPageFinished(view, url); 
      try { 
       if (pb_detail != null) 
        pb_detail.setVisibility(View.GONE); 
      } catch (NullPointerException e) { 
       Log.e("DetailPage", "Page didn't load fully and error is" + e.getMessage()); 
      } 

     } 
    } 

    public void playSound(String id, String buttonClicked, Context context) { 

      DbConnection dbPath = new DbConnection(); 
      SQLiteDatabase db = dbPath.getDbConnection(); 
      boolean isInternetOn = false; 
      boolean isPlayed = false; 
      if(Utils.isTablet(getContext().getApplicationContext())){ 
       try { 
        Thread.sleep(700); 
       } catch (InterruptedException e) { 
        e.printStackTrace(); 
       } 
      } 

     // Check if the current existence of DB is not null 
      if (db != null && !id.equalsIgnoreCase("")) { 
       String fileName = null; 
       Uri url = null; 

       //Check for UK English 
       if (buttonClicked.equals("uk")) { 
        // Tracking for SlideMenu Button Click 
        t = ((LDOCEApp) getActivity().getApplication()).getTracker(LDOCEApp.TrackerName.APP_TRACKER); 
        // Set the screen as Detail Page 
        t.setScreenName("Word Description Page"); 
        // Build and send an Event. 
        t.send(new HitBuilders.EventBuilder() 
          .setCategory("audio_button_action") 
          .setAction("uk_button_click") 
          .setLabel("UKbuttonTapped") 
          .build()); 
        // Query to get the records from uksound table 
        String query = String.format("select * from uksound where id=?"); 
        Cursor cur = db.rawQuery(query, new String[]{id}); 
        //Check id presents in the table 
        while (cur.moveToNext()) { 
         fileName = cur.getString(cur.getColumnIndex("filename")); 
        } 
        if (Environment.getExternalStorageState() 
          .equals(Environment.MEDIA_MOUNTED)) { 
         String filePath = File.separator + "sdcard" + File.separator + "Android" + File.separator + "obb" + File.separator + ".media_files_228" + File.separator + "ldoce6_hwd_gb" + File.separator + fileName; 
         try { 
          FileInputStream fis = new FileInputStream(filePath); 
          String entry = null; 
          while ((entry = fis.toString()) != null) { 
           if (!entry.toString().isEmpty()) { 
            File Mytemp = File.createTempFile("TCL", "mp3", getActivity().getCacheDir()); 
            Mytemp.deleteOnExit(); 
            FileOutputStream fos = new FileOutputStream(Mytemp); 
            for (int c = fis.read(); c != -1; c = fis.read()) { 
             try { 
              fos.write(c); 
             } catch (IOException e) { 
              e.printStackTrace(); 
             } 
            } 
            mediaPlayer = new MediaPlayer(); 
            fos.close(); 
            FileInputStream MyFile = new FileInputStream(Mytemp); 

            mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); 
            mediaPlayer.setDataSource(MyFile.getFD()); 
            mediaPlayer.prepare(); 
            mediaPlayer.start(); 
            mediaPlayer.setOnCompletionListener(this); 
            mediaPlayer.setOnErrorListener(this); 
           } else { 
            Toast.makeText(getContext(), R.string.unable_to_locate_media_files, Toast.LENGTH_LONG).show(); 
           } 
          } 
          fis.close(); 

         } catch (IOException e) { 
          e.printStackTrace(); 

         } finally { 
          if (mediaPlayer != null && !mediaPlayer.isPlaying()) { 
           mediaPlayer.stop(); 
//        mediaPlayer = null; 
           mediaPlayer.release(); 
          } 
         } 
        } 

        if (fileName != null) 
         url = Uri.parse("http://eltapps.pearson.com/ldoce6app/ldoce6_hwd_gb/"); 
       } 

       //Check for US English 
       else if (buttonClicked.equals("us")) { 
        t = ((LDOCEApp) getActivity().getApplication()).getTracker(LDOCEApp.TrackerName.APP_TRACKER); 
        // Set the screen as Detail Page 
        t.setScreenName("Word Description Page"); 
        // Build and send an Event. 
        t.send(new HitBuilders.EventBuilder() 
          .setCategory("audio_button_action") 
          .setAction("us_button_click") 
          .setLabel("USbuttonTapped") 
          .build()); 
        // Query to get the records from ussound table 
        String query = String.format("select * from ussound where id=?"); 
        Cursor cur = db.rawQuery(query, new String[]{id}); 
        //Check id presents in the table 
        while (cur.moveToNext()) { 
         //Assign the filename 
         fileName = cur.getString(cur.getColumnIndex("filename")); 
        } 
        if (Environment.getExternalStorageState() 
          .equals(Environment.MEDIA_MOUNTED)) { 
         String filePath = File.separator + "sdcard" + File.separator + "Android" + File.separator + "obb" + File.separator + ".media_files_228" + File.separator + "ldoce6_hwd_us" + File.separator + fileName; 
         try { 
          FileInputStream fis = new FileInputStream(filePath); 
          String zipFileName = "convertMp3ToDb" + File.separator + "ldoce6_hwd_us" + File.separator + fileName; 
          String entry = null; 
          while ((entry = fis.toString()) != null) { 
           if (!entry.toString().isEmpty()) { 
            File Mytemp = File.createTempFile("TCL", "mp3", getActivity().getCacheDir()); 
            Mytemp.deleteOnExit(); 
            FileOutputStream fos = new FileOutputStream(Mytemp); 
            for (int c = fis.read(); c != -1; c = fis.read()) { 
             try { 
              fos.write(c); 
             } catch (IOException e) { 
              e.printStackTrace(); 
             } 
            } 
            mediaPlayer = new MediaPlayer(); 
            fos.close(); 
            FileInputStream MyFile = new FileInputStream(Mytemp); 
            mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); 
            mediaPlayer.setDataSource(MyFile.getFD()); 
            mediaPlayer.prepare(); 
            mediaPlayer.start(); 
            mediaPlayer.setOnCompletionListener(this); 
            mediaPlayer.setOnErrorListener(this); 
           } else { 
            Toast.makeText(getContext(), R.string.unable_to_locate_media_files, Toast.LENGTH_LONG).show(); 
           } 
          } 
          fis.close(); 

         } catch (IOException e) { 
          e.printStackTrace(); 

         } finally { 
          if (mediaPlayer != null && !mediaPlayer.isPlaying()) { 
           mediaPlayer.stop(); 
//        mediaPlayer = null; 
           mediaPlayer.release(); 
          } 
         } 
        } 
        if (fileName != null) 
         url = Uri.parse("http://eltapps.pearson.com/ldoce6app/ldoce6_hwd_us/"); 
       } else if (buttonClicked.equals("example")) { 
        //fetch the filename from exampleSound table from database 
        String query = String.format("select * from exasound where id=?"); 
        Cursor cur = db.rawQuery(query, new String[]{id}); 
        while (cur.moveToNext()) { 
         fileName = cur.getString(cur.getColumnIndex("filename")); 
        } 

        if (fileName != null) 
         url = Uri.parse("http://eltapps.pearson.com/ldoce6app/ldoce6_exa_pron/"); 
//      Toast.makeText(context,R.string.sorry_audio_is_not_available,Toast.LENGTH_SHORT).show(); 

       } else { 
        Toast.makeText(getContext(), R.string.unable_to_locate_media_files, Toast.LENGTH_LONG).show(); 

       } 

       /*Get the file path url and convert to string 
        * Concatenate the filename with the file path url 
        * Initialise the mediaPlayer and assign the data source with the file path url*/ 
       if (url != null) { 
        String filePath = url.toString(); 
        filePath = filePath.concat(fileName); 
        idToPass = id; 
        buttonToPass = buttonClicked; 
        //Call for media player 
        playerStart(filePath); 
       } else { 
        callToWebView(id, buttonClicked); 
       } 

       // Close the DB Connection 
       db.close(); 
      } else { 
       callToWebView(id, buttonClicked); 
      } 

    } 



    @Override 
    public boolean onError(MediaPlayer mp, int what, int extra) { 
     callToWebView(); 
     return false; 
    } 

    @Override 
    public void onCompletion(MediaPlayer mp) { 
     /*Stop the loader and make the US or UK button back to normal state 
     call the restoreSoundButtonState in main.js */ 
     Log.v("Completed", "Audio played successfully"); 
     //Call for webView without params 
     callToWebView(); 
     mediaPlayer = null; 
    } 

    //Method to call webView to update the button state 
    public void callToWebView(String idToPass, String buttonToPass) { 
     //Call to webView 
     final WebView webview = (WebView) getActivity().findViewById(R.id.wv_headCell); 
     final JSONObject jsonObject = new JSONObject(); 
     try { 
      //Add idToPass and buttonToPass to json object 
      jsonObject.put("id", idToPass); 
      jsonObject.put("btn", buttonToPass); 
     } catch (JSONException e) { 
      e.printStackTrace(); 
     } 
     //Run in a separate thread 
     if (webview != null) 
      webview.post(new Runnable() { 
       @Override 
       public void run() { 
        // Call the jQuery function from java code with the jsonObject 
        webview.loadUrl("javascript:restoreSoundButtonState(" + jsonObject.toString() + ")"); 
       } 
      }); 
    } 

    //function is used to scroll to a particular homnum entry in detail page 
    public void navigateToEntryWithHomnum() { 
     WebView webview = (WebView) getActivity().findViewById(R.id.wv_headCell); 
     if (webview != null) { 
      String function = "javascript:navigateToHomnumOrSense('" + homNum + "')"; 
      webview.loadUrl(function); 
     } 
    } 

    //Media player call 
    private void playerStart(String filePath) { 
     //Make audio manager in stream music 
     if (mediaPlayer == null) 
      mediaPlayer = new MediaPlayer(); 
     mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); 
     mediaPlayer.setOnCompletionListener(this); 
     mediaPlayer.setOnErrorListener(this); 
     try { 
      //Set url to data source 
      mediaPlayer.setDataSource(filePath); 
      //Prepare the player 
      mediaPlayer.prepare(); 
      //Play the audio 
      mediaPlayer.start(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 

    //Handle scenarios for back, home button pressed and fragment cancelled 
    @Override 
    public void onPause() { 
     super.onPause(); 
     if (mediaPlayer != null && mediaPlayer.isPlaying()) { 
      callToWebView(); 
      mediaPlayer.stop(); 
     } 
     mediaPlayer = null; 
     if (displayThread.isAlive()) { 
      handler.removeCallbacksAndMessages(displayThread); 
     } 
    } 

    @Override 
    public void onStart() { 
     super.onStart(); 
     //Remove any additional info if open for tab 
     if(Utils.isTablet(getActivity())) { 
      removeDummyCellAndCloseAdditionalInfo(); 
     } 
     // Sending Hit to GA as Start of new Activity 
     GoogleAnalytics.getInstance(getActivity()).reportActivityStart(getActivity()); 
    } 

    @Override 
    public void onStop() { 
     super.onStop(); 
     if (mediaPlayer != null) { 
      mediaPlayer.stop(); 
      mediaPlayer.release(); 
     } 
     // Sending Hit to GA as End of Activity 
     GoogleAnalytics.getInstance(getActivity()).reportActivityStop(getActivity()); 
     WebView webview = (WebView)getActivity() .findViewById(R.id.wv_headCell); 
     if (webview!=null) 
      scrollYpostion = webview.getScrollY(); 

    } 

    /** 
    * performs search or copy 
    * It will execute the funtion in JavaScript and JSInterface will handle the action 
    * @param action action to be performed 
    */ 
    public void performSearchOrCopy(String action) 

    { 
     WebView webview = (WebView)getActivity() .findViewById(R.id.wv_headCell); 
      // to call the jQuery function from java code 
      JSONArray jsonArray = new JSONArray(); 
      jsonArray.put(action); 
      if(webview!=null) 
       webview.loadUrl("javascript:getSelectedString(" + jsonArray.toString() + ")"); 
    } 

} 
+0

的可能重複[返回按鈕,點擊崩潰的應用程序,而媒體播放器中播放的音頻文件(http://stackoverflow.com/questions/40864920/back-按鈕 - 點擊 - 崩潰 - 應用程序,而媒體播放器播放音頻文件) –

+0

解決方案崩潰? –

+0

無解。你不能在這裏重提問題。 –

回答

0

試試下面的代碼

@Override 
public void onBackPressed() { 
    mediaPlayer.stop(); 
} 
+0

在片段中有可能嗎? –

+0

是的,在Activity上設置了一個片段,當你點擊手機的返回按鈕時,會調用onBackPressed()。既然你重寫了這個函數,這個就行了。請注意,如果這有效。 :) –

+0

覆蓋方法要求一個接口來實現它 –

0

覆蓋在你的活動onBackPressed()方法。

public void onBackPressed() { 
    if(media player is playing) { 
     // then stop it 
     } 
     super.onBackPressed(); 

} 
+0

在片段onbackpressed覆蓋方法不適用 –

+0

http://stackoverflow.com/a/24881908/6448399 –

0

更改您的onPause()以釋放所有MediaPlayer對象,而不是嘗試重新啓動正在播放的歌曲。

public void onPause() {

super.onPause(); 

song.release(); 
song1.release(); 
//and so on 

}`

+0

試過mediaplayer.release();不工作仍然面臨同樣的問題 –

+0

@MahalakshmiSaravanan在回調方法中使用realse方法() –

相關問題