मीडिया प्लेयर को राज्य में 0, त्रुटि कहा जाता है (-38,0)


105

मैं वर्तमान में एक साधारण ऐप डिज़ाइन करने की कोशिश कर रहा हूं जो इंटरनेट रेडियो स्टेशन को स्ट्रीम करता है। मेरे पास स्टेशन के लिए URL है और मैं जैसे Media Player सेट कर रहा हूं

    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)

क्या किसी को पता है कि इसका क्या मतलब है?

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




@SmashCode कृपया किसी अन्य उत्तर को चिह्नित करें क्योंकि मेरा उत्तर अनुपयोगी है।
टाइडबेक

जवाबों:


120

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

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

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

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

क्या होगा अगर हम इसे तुरंत शुरू नहीं करना चाहते हैं? यहां तक कि अगर मैं अपने खिलाड़ी को प्रारंभ और एक मिनट के लिए पहली बार मैं इसे खेलने की कोशिश प्रतीक्षा करें, तो उसे इस त्रुटि है जब तक कि मैं .start () onPrepared में फोन
elliptica

1
आप इसे पहले तैयार करें और याद रखें कि आपने इसे तैयार किया है। समानांतर में, आप यह याद रखने की कोशिश करते हैं कि क्या आप इसे चलाना चाहते हैं। जब यह दोनों तैयार हो जाता है और आप इसे चलाना चाहते हैं, तो आप इसे शुरू करते हैं।
विक्टर पेलेगोल्यू

33

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

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

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

इसके अतिरिक्त, MediaPlayer ईवेंट-संदेश भेज रहा है। यहां तक ​​कि अगर आपको तैयार-ईवेंट की आवश्यकता नहीं है (हालांकि इस ईवेंट को निकाल दिए जाने से पहले प्लेबैक शुरू नहीं करना एक अच्छा विचार होगा) आपको कॉलबैक-श्रोता सेट करना होगा। यह भी , और OnErrorListener, के लिए सच हैOnCompletionListenerOnPreparedListenerOnSeekCompletedListener (यदि आप फोन विधि की तलाश)।

श्रोताओं को बस द्वारा संलग्न किया जा सकता है

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

खिलाड़ी नहीं खेलने पर कॉलिंग पॉज़ () मेरा मामला था
स्टेवो.मिट 20

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

14

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


आपने यह कैसे पता लगाया कि यह किस कारण से था?
AdamMc331

9

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

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

4

मैं नीचे कोड का परीक्षण किया। अच्छा कर रहा है

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;
}
}

का SetAudioStreamType(..)उपयोग करने के लिए और अद्यतन करने के लिएSetAudioAttributes(...)
पियरे

4

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

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 () में onPause ()


3

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


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

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

क्या आपने एक त्रुटि श्रोता स्थापित करने का प्रयास किया था। MediaPlayer mp = new MediaPlayer () {@Override public void setOnErrorListener (android.media.MediaPlayer.OnErrorListener श्रोता) {// क्या यहाँ सामान है ..}; mp.setDataSource (..
रुक्मल दिवस

1

यहां छवि विवरण दर्ज करें

तस्वीर के ऊपर, आप सही तरीका पा सकते हैं।


0

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

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

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

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

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


0

मैंने खेलने से पहले हर बार 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

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

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

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

<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

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


क्या आप अधिक विस्तार से बताएंगे?
कार्तिक AMR

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

-1

मैं एंड्रॉइड प्रोग्रामिंग में नया हूं और मेरे पास यह एक ही त्रुटि थी। इसलिए मैंने केवल mp.createmediaPlayer = MediaPlayer.create (getApplicationContext (), Settings.System.DEFAULT_RINGTONE_URI) को फिर से परिभाषित किया। यह ऐसा करने का सही तरीका नहीं हो सकता है लेकिन इसने मेरे लिए काम किया:

try {
  mp = MediaPlayer.create(getApplicationContext(), Settings.System.DEFAULT_RINGTONE_URI);
} catch (Exception e) {
  e.printStackTrace();
}

mp.start();

-2
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();
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.