মিডিয়া প্লেয়ার 0 টি অবস্থায় ডাকা হয়েছে, ত্রুটি (-38,0)


105

আমি বর্তমানে একটি সাধারণ অ্যাপ্লিকেশন ডিজাইন করার চেষ্টা করছি যা একটি ইন্টারনেট রেডিও স্টেশন প্রবাহিত করে। স্টেশনের জন্য আমার ইউআরএল রয়েছে এবং মিডিয়া প্লেয়ারটি সেট আপ করছি

    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)

কেউ এর অর্থ কী জানেন?

এই রাষ্ট্রীয় ত্রুটিগুলি সম্পর্কে আমি কিছুটা পড়েছি, তবে আমার প্রকল্পে প্রযোজ্য এমন কোনও কিছুই খুঁজে পাইনি।




@ স্ম্যাশকোড দয়া করে অন্য উত্তরটি স্বীকৃত হিসাবে চিহ্নিত করুন কারণ আমার উত্তরটি সম্পূর্ণ অকেজো।
tidbeck

উত্তর:


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
আপনি এটি আগে প্রস্তুত এবং মনে রাখবেন যে আপনি এটি প্রস্তুত করেছেন। সমান্তরালভাবে, আপনি এটি চালাতে চান কিনা তা মনে করার চেষ্টা করুন। যখন এটি উভয়ই প্রস্তুত হয় এবং আপনি এটি চালাতে চান, আপনি এটি শুরু করুন।
ভিক্টর Paléologue

33

দেখে মনে হচ্ছে ত্রুটি -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);
    }
});

প্লেয়ার না খেলার বিষয়ে বিরতি দেওয়া () কল করা আমার ঘটনা ছিল
stevo.mit

একটি অবৈধ অবস্থায় মিডিয়াপ্লেয়ার.আইসপ্লেইং () কল করা মিডিয়া প্লেয়ারকে একটি ত্রুটি অবস্থায় প্রেরণ করবে। রাজ্যগুলি বজায় রাখার জন্য একটি স্পষ্ট enum বজায় রাখা ভাল।
ম্যাডিয়েডেক্সটার

14

আমি যখন মিডিয়া প্লেয়ারের বর্তমান অবস্থান (মিডিয়াপ্লেয়ার.সেটকারেন্টপজিশন ()) যখন প্রস্তুত বর্ণিত ছিল না তখন তা পাওয়ার চেষ্টা করার সময় আমি এই ত্রুটিটি পেয়েছি। আমি এর স্থিতি সম্পর্কে নজর রাখার মাধ্যমে এবং অনপ্রিপ্রেডলাইজনারের পরে কেবল getCurrentPosition () পদ্ধতিতে কল করে এটি পেয়েছি।


আপনি কীভাবে বুঝতে পেরেছিলেন যে এই কারণে?
অ্যাডামএমসি 331

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

কিছু সময় ফাইল এমনভাবে এনকোড করা হয় যাতে অ্যান্ড্রয়েড ডিকোড করতে পারে না। এমনকি কিছু এমপি 4 ফাইল প্লে করা যায় না। দয়া করে একটি আলাদা ফাইল ফর্ম্যাট চেষ্টা করুন (.3gp বেশিরভাগ সময় বাজানো হয়) এবং দেখুন ..


46
আমি কোনও ইন্টারনেট রেডিও স্টেশনকে তাদের ফাইলের ফর্ম্যাট পরিবর্তন করতে বলতে পারি না।
স্ম্যাশকোড

আপনি কি "এই ভিডিওটি প্লে করতে পারবেন না" পপআপ পান? আপনি এটি কিভাবে মোকাবেলা করবেন? আমি ত্রুটিটি ধরছি তবে নির্বিশেষে এই মডেলটি পেয়েছি এবং গণমাধ্যমের উত্সের উপর আমার কোনও নিয়ন্ত্রণ নেই কারণ এটি জনসাধারণের API থেকে আসে। যদি কেউ "এই ভিডিওটি প্লে করতে পারবেন না" মডেলটিকে কীভাবে প্রতিরোধ করতে হয় তবে আমি কৃতজ্ঞ হব।
ক্রাফটি

আপনি কি ত্রুটি শ্রোতা সেট করার চেষ্টা করেছেন? মিডিয়াপ্লেয়ার এমপি = নতুন মিডিয়াপ্লেয়ার () {@ ওভাররাইড পাবলিক অকার্যকর সেটঅনআররল্লিজার (android.media.MediaPlayer.OnErrorListener শ্রোতা) {// এখানে জিনিসগুলি করুন ..}}; এমপি.সেটডাটা সোর্স (..
রুকমাল ডায়াস

1

এখানে চিত্র বর্ণনা লিখুন

ছবির উপরে, আপনি সঠিকভাবে পেতে পারেন।


0

আপনি লগগুলিতে এই বার্তাটি পান, কারণ আপনি এমন কিছু করেন যা আপনার মিডিয়াপ্লেয়ার উদাহরণের বর্তমান অবস্থায় অনুমোদিত নয়।

সুতরাং এই জিনিসগুলি ধরার জন্য আপনার সর্বদা একটি ত্রুটি হ্যান্ডলারের নিবন্ধন করা উচিত (@ টিডব্যাকের পরামর্শ অনুসারে)।

প্রথমে, আমি আপনাকে পরামর্শ দিচ্ছি যে MediaPlayerক্লাসের জন্য ডকুমেন্টেশনগুলি একবার দেখুন এবং এর সাথে রাষ্ট্রগুলির কী বোঝায় তা বোঝা। দেখুন: http://developer.android.com/references/android/media/MediaPlayer.html# স্টেটডায়াগ্রাম

আপনার ভুলটি এখানে সাধারণ সমস্যাগুলির মধ্যে একটি হতে পারে, অন্যরা এখানে লিখেছিল, তবে সাধারণভাবে, আমি কোন পদ্ধতিতে কোন পদ্ধতিতে কল করতে বৈধ তা প্রমাণিত করার ডকুমেন্টেশনটি একবার দেখব: http://developer.android.com/ রেফারেন্স / অ্যান্ড্রয়েড / মিডিয়া / MediaPlayer.html # Valid_and_Invalid_States

আমার উদাহরণে এটি ছিল সেই পদ্ধতি mediaPlayer.CurrentPosition, যা আমি মিডিয়া প্লেয়ারকে এমন অবস্থায় থাকাকালীন ডাকতাম, যেখানে এই সম্পত্তিটি কল করার অনুমতি ছিল না।


0

আমি ত্রুটিগুলি (-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

আমি এই ত্রুটিটিও পেয়েছিআমি প্রিপেইডলাইস্টেনার দিয়ে চেষ্টা করেছি কিন্তু তবুও এই ত্রুটিটি পেয়েছি। অবশেষে আমি সমাধান পেয়েছি যে ত্রুটিটি আমার দোষ কারণ আমি অ্যান্ড্রয়েড ম্যানিফেস্ট xML এ ইন্টারনেট অনুমতি ভুলে গিয়েছি। :)

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

আমি মিডিয়াপ্লেয়ারের জন্য নমুনা কোডিং ব্যবহার করেছি। আমি স্ট্রিম সার্ভিস.জভা পদ্ধতিতে ব্যবহার করেছি
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().এটি আপনার সমস্যার সমাধান করতে পারে। আমি ইতিমধ্যে চেষ্টা করেছি।


আপনি আরো নির্দিষ্ট হতে পারে?
কার্তিক এএমআর

দুঃখিত, ইংরেজি আমার প্রথম ভাষা নয়, এবং আমি এটিতেও ভাল নই ... তবে আমি অন্যদেরও একই রকম প্রশ্ন করতে সহায়তা করতে চাই, এটাই সব।
পিয়ারলেস2012

-1

আমি অ্যান্ড্রয়েড প্রোগ্রামিংয়ে নতুন এবং আমার এইর মতোই ত্রুটি ছিল। সুতরাং আমি কেবল mp.createmediaPlayer = MediaPlayer.create (getApplicationContext (), সেটিংস.সিসটেম.ডিএফএল.আর.আর.িং.টোন। এটি করার সঠিক উপায় নাও হতে পারে তবে এটি আমার জন্য জরিমানার কাজ করেছে:

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();
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.