2012-01-25 14 views
76

मैं वर्तमान में एक साधारण ऐप डिज़ाइन करने की कोशिश कर रहा हूं जो एक इंटरनेट रेडियो स्टेशन स्ट्रीम करता है। मैं स्टेशन के लिए URL है और तरहमीडिया प्लेयर 0 में त्रुटि, त्रुटि (-38,0)

MediaPlayer mediaPlayer = new MediaPlayer(); 
    try { 
     mediaPlayer.setDataSource(URL); 
    } catch (IllegalArgumentException e) { 
     e.printStackTrace(); 
    } catch (SecurityException e) { 
     e.printStackTrace(); 
    } catch (IllegalStateException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    try { 
     mediaPlayer.prepare(); 
    } catch (IllegalStateException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    mediaPlayer.start(); 

कार्यक्रम जब नकल करते दुर्घटनाग्रस्त नहीं है, लेकिन कुछ भी नहीं खेल रहा है और मैं निम्नलिखित त्रुटि मिलती हूँ मीडिया प्लेयर की स्थापना कर रहा हूँ:

start called in state 0 

और नीचे यह

Error (-38,0) 

क्या किसी को पता है इसका क्या अर्थ है?

मैंने इन राज्य त्रुटियों के बारे में कुछ पढ़ा है, लेकिन मेरी परियोजना पर लागू होने वाली कुछ भी नहीं मिल सका।

+1

http://stackoverflow.com/questions/8681550/android-2-2-mediaplayer-is-working-fine-with-one-shoutcast-url -but-not-with- http://stackoverflow.com/questions/8671479/android-mediaplayer-works-fine-in-our-custom-audio-streaming-plication-up-to-a –

+0

संभावित डुप्लिकेट [एंड्रॉइड मीडियाप्लेयर समस्याएं: "त्रुटि (-38, 0)" और "राज्य 1 में कॉल करना बंद करें"] (http://stackoverflow.com/questions/11913108/android-mediaplayer-problems-error-38-0-and -स्टॉप-इन-स्टेट-स्टेट -1) – rds

+0

@SmashCode कृपया एक और जवाब चिह्नित करें जैसा स्वीकार किया गया है क्योंकि मेरा जवाब पूरी तरह बेकार है। – tidbeck

उत्तर

89

आपको श्रोता का उपयोग करके onPrepared विधि में mediaPlayer.start() पर कॉल करने की आवश्यकता है। आपको यह त्रुटि मिल रही है क्योंकि आप तैयार राज्य तक पहुंचने से पहले mediaPlayer.start() पर कॉल कर रहे हैं।

यहाँ कैसे आप यह कर सकते है:

mp.setDataSource(url); 
mp.setOnPreparedListener(this); 
mp.prepareAsync(); 

public void onPrepared(MediaPlayer player) { 
    player.start(); 
} 
+12

यह समाधान mp.start(); player.start(); –

+1

धन्यवाद के साथ काम करता है धन्यवाद! यह सही उत्तर होना चाहिए। – asgs

+0

क्या होगा यदि हम इसे तुरंत शुरू नहीं करना चाहते हैं? यहां तक ​​कि अगर मैं अपने खिलाड़ी को शुरू करता हूं और एक मिनट प्रतीक्षा करता हूं, तो पहली बार जब मैं इसे चलाने का प्रयास करता हूं, तब तक यह त्रुटि तब तक होती है जब तक कि मैं .start() को कॉल नहीं करता हूं। – Elliptica

2

कुछ बार फ़ाइल एन्कोड की जाती है कि एंड्रॉइड डीकोड नहीं कर सकता है। यहां तक ​​कि कुछ mp4 फ़ाइलों को भी नहीं खेला जा सकता है। कृपया एक अलग फ़ाइल प्रारूप (.3gp अधिकांश समय खेला जाता है) देखें और देखें ..

+37

मैं अपने फ़ाइल प्रारूप को बदलने के लिए एक इंटरनेट रेडियो स्टेशन से नहीं पूछ सकता। – SmashCode

+0

क्या आपको "इस वीडियो को नहीं चलाया जा सकता" पॉपअप मिलता है? आप इसके साथ कैसे लेन - देन करते हैं? मुझे त्रुटि मिलती है लेकिन इस मोडल को ध्यान में रखें और मीडिया के स्रोत पर मेरा कोई नियंत्रण नहीं है क्योंकि यह सार्वजनिक एपीआई से आता है। अगर कोई जानता है कि "इस वीडियो को नहीं चलाया जा सकता" मोडल को कैसे रोकें तो मैं आभारी रहूंगा। – Krafty

+0

क्या आपने त्रुटि श्रोता सेट करने का प्रयास किया था। MediaPlayer mp = नए MediaPlayer() { @Override सार्वजनिक शून्य setOnErrorListener (android.media.MediaPlayer.OnErrorListener श्रोता) { // यहां सामान करो .. } }; mp.setDataSource (.. –

24

यह त्रुटि -38 की तरह लगता है एक राज्य अपवाद (त्रुटि संदेश इंगित करता है के रूप में) का अर्थ है। उदाहरण के लिए यदि आप start() पर कॉल करते हैं, तो गीत तैयार होने से पहले, या जब आप pause() पर कॉल करते हैं, भले ही गीत बिल्कुल नहीं चल रहा हो।

इस समस्या को हल करने के लिए विधियों को कॉल करने से पहले मीडिया प्लेयर की स्थिति की जांच करें। उदाहरण के लिए:

if(mediaPlayer.isPlaying()) { 
    mediaPlayer.pause(); 
} 

इसके अतिरिक्त, मीडियाप्लेयर ईवेंट-संदेश भेज रहा है। भले ही आपको तैयार-ईवेंट की आवश्यकता न हो (भले ही इस ईवेंट को निकाल दिया गया था, प्लेबैक शुरू करना अच्छा नहीं होगा) आपको कॉलबैक-श्रोता सेट करना होगा। यह OnErrorListener, OnCompletionListener, OnPreparedListener और OnSeekCompletedListener (यदि आप खोज विधि को कॉल करते हैं) के लिए भी सच है।

श्रोताओं द्वारा

mediaPlayer.setOnPreparedListener(new OnPreparedListener() { 
    @Override 
    public void onPrepared(MediaPlayer mp) { 
     // Do something. For example: playButton.setEnabled(true); 
    } 
}); 
+0

कॉलिंग पॉज़() को प्लेयर नहीं खेलना मेरा केस –

+0

कॉलिंग मीडिया प्लेयर है अमान्य स्थिति में .isPlaying() मीडिया प्लेयर को एक त्रुटि स्थिति में भेज देगा। राज्यों को बनाए रखने के लिए एक स्पष्ट enum बनाए रखने के लिए बेहतर। – Madeyedexter

2

मैं नीचे दिए गए कोड का परीक्षण बस संलग्न किया जा सकता है। काम कर ठीक

public class test extends Activity implements OnErrorListener, OnPreparedListener { 

private MediaPlayer player; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 


    player = new MediaPlayer(); 
    player.setAudioStreamType(AudioManager.STREAM_MUSIC); 
    try { 
     player.setDataSource("http://www.hubharp.com/web_sound/BachGavotte.mp3"); 
     player.setOnErrorListener(this); 
     player.setOnPreparedListener(this); 
     player.prepareAsync(); 
    } catch (IllegalArgumentException e) { 
     e.printStackTrace(); 
    } catch (IllegalStateException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    }  
} 
@Override 
public void onDestroy() { 
    super.onDestroy(); 
    player.release(); 
    player = null; 
} 
@Override 
public void onPrepared(MediaPlayer play) { 
    play.start(); 
} 
@Override 
public boolean onError(MediaPlayer arg0, int arg1, int arg2) { 
    return false; 
} 
} 
6

यह मेरा कोड, परीक्षण किया है और काम कर ठीक है:

package com.example.com.mak.mediaplayer; 

import android.media.MediaPlayer; 
import android.os.Bundle; 
import android.view.View; 
import android.widget.Button; 
import android.app.Activity; 

public class MainActivity extends Activity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    final MediaPlayer mpp = MediaPlayer.create(this, R.raw.red); //mp3 file in res/raw folder 

    Button btnplay = (Button) findViewById(R.id.btnplay); //Play 
    btnplay.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View vone) { 
     mpp.start(); 
     } 
    }); 

    Button btnpause = (Button) findViewById(R.id.btnpause); //Pause 
    btnpause.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View vtwo) { 
     if (mpp.isPlaying()) { 
      mpp.pause(); 
      mpp.seekTo(0); 
     } 
     } 
    }); 
    } 
} 
+1

धन्यवाद, यह मेरे लिए भी वास्तव में सहायक था! – Valdrinit

-1

मैं बस से पहले एक ही समस्या से मुलाकात की, पहली मंजिल पर दोस्त सही था, आप start() पर बुलाया गलत समय, आपको इस विधि mediaPlayer.setOnPreparedListener(this) के साथ तैयार() या prepareSync() के लिए श्रोता सेट करना चाहिए; तैयार करने से पहले, इस कॉलबैक कॉल start() पर कॉल करें। यह आपकी समस्या का समाधान कर सकता है। मैंने पहले ही कोशिश की है।

+0

क्या आप अधिक विशिष्ट हो सकते हैं? –

+0

क्षमा करें, अंग्रेज़ी मेरी पहली भाषा नहीं है, और मैं भी इसमें अच्छा नहीं हूं ... लेकिन मैं सिर्फ उन लोगों की मदद करना चाहता हूं जिनके समान प्रश्न हैं ,बस इतना ही। – peerless2012

2

मुझे कुछ दिन पहले एक ही समस्या का सामना करना पड़ा।मेरा ऑडियो मीडियाप्लेयर उच्च प्रसंस्करण शक्ति वाले उपकरणों पर ठीक काम करता है, लेकिन धीमी उपकरणों के लिए, मीडिया प्लेयर ने कुछ समय नहीं खेला और लॉगकैट से इसे गलत स्थिति में बुलाए जाने की कई शिकायतें हुईं। इसलिए मैं यह start(), ठहराव() करने के लिए कॉल डाल फोन करके हल हो गई, ... onPrepared() OnPreparedListener() के रूप में नीचे की विधि में:

mediaPlayer.prepare(); 
mediaPlayer.setOnPreparedListener(new OnPreparedListener() { 
       @Override 
       public void onPrepared(MediaPlayer mp) { 
        ........ 
        mediaPlayer.start(); 
        .... 
        songControlBtn.setOnClickListener(new OnClickListener() { 
         @Override 
         public void onClick(View v) { 
          if (mediaPlayer.isPlaying()) { 
           mediaPlayer.pause(); 

          } else { 
           mediaPlayer.start(); 

          } 
         } 
        }); 

        mediaPlayer.setOnCompletionListener(new OnCompletionListener() { 
         @Override 
         public void onCompletion(MediaPlayer mp) { 
          ............ 

         } 
        }); 
       } 
      }); 

इसके अलावा कोशिश किसी भी मीडिया प्लेयर को रिलीज़ करने के लिए जिसकी आपको आवश्यकता नहीं है। उदाहरण के लिए, यदि आप पृष्ठभूमि पर ऑडियो या वीडियो नहीं खेलना चाहते हैं तो आपको MediaPlayer.release()पर रोकें() पर कॉल करना चाहिए।

0

आपको यह संदेश लॉग में मिलता है, क्योंकि आप ऐसा कुछ ऐसा करते हैं जिसे आपके मीडियाप्लेयर इंस्टेंस की वर्तमान स्थिति में अनुमति नहीं है।

इसलिए आपको उन चीज़ों को पकड़ने के लिए हमेशा एक त्रुटि हैंडलर पंजीकृत करना चाहिए (जैसा कि @ टिडबेक सुझाया गया है)।

सबसे पहले, मैं सलाह देता हूं कि आप MediaPlayer कक्षा के लिए प्रलेखन को देखें और राज्यों के साथ क्या समझें। देखें: http://developer.android.com/reference/android/media/MediaPlayer.html#StateDiagram

आपका यहाँ गलती अच्छी तरह से आम लोगों में से एक हो सकता है, दूसरों को यहाँ लिखा था, लेकिन सामान्य रूप में, मैं के प्रलेखन पर एक नज़र डालें क्या तरीकों क्या राज्य में कॉल करने के लिए मान्य हैं जाएगा: http://developer.android.com/reference/android/media/MediaPlayer.html#Valid_and_Invalid_States

मेरे उदाहरण में यह विधि mediaPlayer.CurrentPosition थी, जिसे मैंने मीडिया प्लेयर के राज्य में रखा था, जहां इसे इस संपत्ति को कॉल करने की अनुमति नहीं थी।

-1
mp = new MediaPlayer(); 
     AssetFileDescriptor afd = mContext.getAssets().openFd(fileName); 
     mp.reset(); 
     mp.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), 
       afd.getLength()); 
     mp.prepare(); 
     mp.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { 
      public void onPrepared(MediaPlayer mp) { 
       mp.start(); 
      } 
     }); 
     mp.prepareAsync(); 
6

मैं इस त्रुटि जब मैं (MediaPlayer.getCurrentPosition()) मीडिया प्लेयर की वर्तमान स्थिति प्राप्त करने के लिए जब यह तैयार कहा में नहीं था कोशिश कर रहा था मिल गया। मैं इसके बारे में अपने राज्य का ट्रैक रखकर और केवल प्राप्त करने के बाद getCurrentPosition() विधि को कॉल करके प्रस्तुत किया गया है।

+1

धन्यवाद आपने मुझे –

+0

अनुमान लगाने के घंटों को बचाया है कि आपने यह कारण कैसे निकाला था? – AdamMc331

0

मुझे यह त्रुटि भी मिली है जिसे मैंने ऑनपेड लिस्टनर के साथ आजमाया लेकिन अभी भी यह त्रुटि मिली है। आखिरकार मुझे समाधान मिला कि त्रुटि मेरी गलती है क्योंकि मैं एंड्रॉइड मैनिफेस्ट एक्सएमएल में इंटरनेट अनुमति भूल गया था। :)

<uses-permission android:name="android.permission.INTERNET" /> 

मैंने मेडियाप्लेयर के लिए नमूना कोडिंग का उपयोग किया। मैं StreamService.java में इस्तेमाल
onCreate विधि

 String url = "http://s17.myradiostream.com:11474/"; 
     mediaPlayer = new MediaPlayer();    
     mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); 
     mediaPlayer.setDataSource(url); 
     mediaPlayer.prepare(); 
1

मैं MediaPlayer की एक नई वस्तु बनाने के द्वारा दोनों त्रुटियों (-19,0) और (-38,0), हल खेलने से पहले हर बार और उसके बाद इसे जारी करना।

से पहले:

void play(int resourceID) { 
if (getActivity() != null) { 

    //Using the same object - Problem persists 
    player = MediaPlayer.create(getActivity(), resourceID); 
    player.setAudioStreamType(AudioManager.STREAM_MUSIC); 

    player.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { 
     @Override 
     public void onCompletion(MediaPlayer mp) { 
      player.release(); 
     } 
    }); 

    player.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { 
     @Override 
     public void onPrepared(MediaPlayer mp) { 
      mp.start(); 
     } 
    }); 

} 

}

के बाद:

void play(int resourceID) { 

if (getActivity() != null) { 

    //Problem Solved 
    //Creating new MediaPlayer object every time and releasing it after completion 
    final MediaPlayer player = MediaPlayer.create(getActivity(), resourceID); 
    player.setAudioStreamType(AudioManager.STREAM_MUSIC); 

    player.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { 
     @Override 
     public void onCompletion(MediaPlayer mp) { 
      player.release(); 
     } 
    }); 

    player.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { 
     @Override 
     public void onPrepared(MediaPlayer mp) { 
      mp.start(); 
     } 
    }); 

} 

}

0
if(length>0) 
     { 
      mediaPlayer = new MediaPlayer(); 
      Log.d("length",""+length); 
      try { 
       mediaPlayer.setDataSource(getApplication(),Uri.parse(uri)); 
      } catch(IOException e) { 
       e.printStackTrace(); 
      } 
      mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { 
       @Override 
       public void onPrepared(MediaPlayer mediaPlayer) { 
        mediaPlayer.seekTo(length); 
        mediaPlayer.start(); 

       } 
      }); 
      mediaPlayer.prepareAsync(); 
+0

कृपया कोड में कुछ स्पष्टीकरण भी जोड़ें? –

0

यह हर बहुत निराश था। तो, मुझे समाधान मिला जो मेरे लिए काम करता है।

try { 
         if (mediaPlayer != null) { 
          mediaPlayer.release(); 
          mediaPlayer = null; 

         } 
         mediaPlayer = new MediaPlayer(); 
         mediaPlayer.setDataSource(file.getAbsolutePath()); 
         mediaPlayer.setAudioStreamType(AudioManager.STREAM_NOTIFICATION); 
         mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { 
          @Override 
          public void onPrepared(MediaPlayer mediaPlayer) { 
           mediaPlayer.start(); 
           mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { 
            @Override 
            public void onCompletion(MediaPlayer mediaPlayer) { 
             mediaPlayer.stop(); 
             mediaPlayer.release(); 
             mediaPlayer = null; 
            } 
           }); 
          } 
         }); 
         mediaPlayer.prepare(); 
        } catch (Exception e) { 
         e.printStackTrace(); 
        } 
0

मुझे इसके लिए

काम किया
mp.seekTo(0); 
mp.start(); 
संबंधित मुद्दे