Mediaplayer е спрян от AsyncTask - MediaPlayer е финализиран, без да бъде пуснат

Стартирам приложението си, като изтегля нови файлове, ако има такива, започвайки цикъл на възпроизвеждане. След това стартирам задача за търсене на нови медии на всеки x секунди. Веднага щом задачата бъде извикана, видеото спира да се възпроизвежда с грешката MediaPlayer е финализиран, без да бъде пуснат.

Трябва да изтегли нови медии, ако има такива, и просто да актуализира плейлиста.

От това, което регистрира, виждам, че се извиква първото възпроизвеждане, след което се появява грешката и след това. Просто извиква задачата отново и отново. Сякаш е заседнал там?

Сигурен съм, че това е някакъв тъп проблем, който пропускам тук. Не съм сигурен защо медийният плейър спира?

Основна дейност

public class MainActivity extends Activity implements OnCompletionListener {

    int playListIndex;
    int currentMedia;
    String mediaName;
    ArrayList<Integer> playList = new ArrayList<Integer>();
    File[] filelist;
    private VideoView videoView;
    private ImageView imageView;
    Uri mediaPath;
    private Handler mHandler = new Handler();
    private SurfaceHolder holder;


//  Get this shit from login!
    public String channelid = "5e6299eb-asd6600d58fc9";
    public String username = "tvasd";
    public String linkid = "70casd6600d3f7d7";

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);

//      File mediadir = getDir("tvr", Context.MODE_PRIVATE);
//        filelist = mediadir.listFiles();
        try {
            downloadMedia(this);
            updateMediaTask(this);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (JSONException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

//       Delete all files in folder
//        if (mediadir.isDirectory()) {
//            String[] children = mediadir.list();
//            for (int i = 0; i < children.length; i++) {
//                new File(mediadir, children[i]).delete();
//            }
//        }
    }
    @Override
    public void onCompletion(MediaPlayer mp) {
        Log.i("media player", "play next please!");
        if (mp != null) {
            mp.release();
        }
//      play next video
        currentMedia++;
        if (currentMedia > playList.size() - 1) {
            currentMedia = 0;
        }
        Log.d("MEDIA_COUNTER", String.format("%d", currentMedia));
        try {
            playMedia(currentMedia);
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

    private void playMedia(int playListIndex) throws IOException {
        Log.i("media player", "play media!");
        String path = filelist[playListIndex].getAbsolutePath();
        FileInputStream fileInputStream = new FileInputStream(path);
        final Uri uri = Uri.parse(path);
        String filename = filelist[playListIndex].getName();
        Log.i("FILENAME", path);
        if (filename.contains("image")) {
            imageView = (ImageView)findViewById(R.id.imageView);
            imageView.setVisibility(View.VISIBLE);
            imageView.setImageURI(uri);
            mHandler.postDelayed(new Runnable() {
                public void run() {
                    imageView.setVisibility(View.GONE);
                    imageView.setImageURI(uri);
                    onCompletion(null);
                }
            }, 4000);
        } else if (filename.contains("video")) {

            Log.d("PLAY",String.format("%s", fileInputStream.getFD()));
            Log.i("media player", "play video!");
            SurfaceView surface = (SurfaceView) findViewById(R.id.surface);
            holder = surface.getHolder();
            holder.addCallback(new SurfaceHolder.Callback() {
                @Override
                public void surfaceCreated(SurfaceHolder holder) {
                    Log.i("SURFACE", "Created");
                }
                @Override
                public void surfaceDestroyed(SurfaceHolder holder) {}
                @Override
                public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {}
            });
            MediaPlayer pl = new MediaPlayer();
            pl.setOnCompletionListener(this);
            pl.setDisplay(holder);
            pl.setDataSource(fileInputStream.getFD());
            pl.prepare();
            pl.start();
        }
    }



    void createPlayList(Context context) {
        ContextWrapper cw = new ContextWrapper(context);
        File mediadir = cw.getDir("tvr", Context.MODE_PRIVATE);
        filelist = mediadir.listFiles();
        if (filelist != null)
        {
            for ( int i = 0;i<filelist.length;i++)
            {
               Log.i("FOKKER", filelist[i].getName());
               Log.i("FOKKER", filelist[i].getAbsolutePath());
            }
        }

        currentMedia = 0;

        MainActivity.this.runOnUiThread(new Runnable() {
            public void run() {
                try {
                    playMedia(currentMedia);
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        });
    }

    private void updateMediaTask(final MainActivity a) throws IOException, JSONException {
        int delay = 1000; // delay for 1 sec. 
        int period = 3000; // repeat every 10 minutes. 60000 
        Timer timer = new Timer(); 
        timer.scheduleAtFixedRate(new TimerTask() { 
            public void run()  { 
                new updateFiles(a).execute(getBaseContext(),"update");
            } 
        }, delay, period); 
    }

    private void downloadMedia(Context context) throws IOException, JSONException {
        new updateFiles(this).execute(context,"new");
    }

}

Това е класът updateFiles:

public class updateFiles extends AsyncTask<Object, Integer, Long> {



     public MainActivity activity;

        public updateFiles(MainActivity a) { activity = a;}

    @Override
    protected Long doInBackground(Object... params) {
        Context context = (Context) params[0];
        String method = (String) params[1];
        File mediadir = context.getDir("tvr", Context.MODE_PRIVATE);
        JSONArray channels = Json.getJson("http://192.168.2.136:8080/rest/channel/"+ linkid +"/"+ username, "GET");
        try {
            for (int i=0; i < channels.length(); i++) { 
                JSONObject channel_data = channels.getJSONObject(i);
                String channelID = channel_data.getString("ChannelID").toLowerCase();
                JSONArray json = Json.getJson("http://192.168.2.136:8080/rest/program/"+ linkid +"/"+ username +"/" + channelID, "GET");
                try {
                    for (int j=0; j < json.length(); j++) { 
                        JSONObject json_data = json.getJSONObject(j);
                        String name = json_data.getString("Name").toLowerCase();
                        name = name.replace("-", "_");
                        if (name.contains("mp4") || name.contains("png") || name.contains("jpg") || name.contains("jpeg")) {
                            if (name.contains("mp4")) {
                                name = "/video_"+name;
                            } else if (name.contains("png") || name.contains("jpg") || name.contains("jpeg")) {
                                name = "/image_"+name;
                            }
                            String _name = name.replace("/", "");
                            File file = new File(mediadir, _name);
                            if(file.exists()) {
                                Log.i("FILE FOUND", _name);
                            } else {
                                new Download().execute(context, name, "http://192.168.2.136:8080/rest/transfer/"+ linkid +"/"+ username +"/" + json_data.getString("ID"));
                            }
                        }

                    }
                } catch (JSONException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        } catch (JSONException e) {
            e.printStackTrace();
        } catch (NullPointerException e) {
            e.printStackTrace();
        }
        Log.i("UPDATEFILES done", method);
        if ( method == "new" ) {
            Log.i("XXX", "This is a new method, so play now");
            activity.createPlayList(context);
        } else {
            Log.i("XXX", "This is a update method, so just update, dont play again. Go on playing");
//          activity.filelist = mediadir.listFiles();
        }
        return null;

    }

}

Дневникът:

02-21 16:16:13.429: I/FILE FOUND(24010): video_tvr_webtrailer2.mp4
02-21 16:16:13.429: I/FILE FOUND(24010): video_tvr_consumerintro.mp4
02-21 16:16:13.429: I/JSON(24010): http://192.168.2.136:8080/rest/program/70c8223f-e054-4f33asd3f7d7/asdco/6cfbasdbe-a16600d5ac24
02-21 16:16:13.476: D/JSON result(24010): [{"ChannelID":"6casdd2-47f3-95be-a16600d5ac24","ChannelPath":"\\asda","DateChanged":"2\/15\/2013 10:59:20 AM","DateCreated":"2\/15\/2013 12:58:59 PM","ID":"5e25edasd-b82b-a16600d5f4ef","LastWriteUTC":"\/Date(1352527205000+0200)\/","Name":"Video_05-safety-ccw_mynhardt.wmv","Size":125727228}]
02-21 16:16:13.476: I/JSON(24010): **http://192.asd0/rest/program/7asd4-4f33-9b6b-a1660asd89-be1a-a16600e0bcee**
02-21 16:16:13.523: **D/JSON result(24010): []**
02-21 16:16:13.523: **I/UPDATEFILES done(24010): update**
02-21 16:16:13.523: I/XXX(24010): **This is a update method, so just update, dont play again. Go on playing**

person Harry    schedule 21.02.2013    source източник
comment
Мисля, че виждам проблема, вероятно поради частта с таймера, мисля, че това трябва да бъде в нова тема?   -  person Harry    schedule 21.02.2013
comment
Ако заменя частта new updateFiles(a).execute(getBaseContext(),update); с нов запис в дневника работи. Така че това е, когато отново извиква updateFiles.   -  person Harry    schedule 21.02.2013
comment

Правилата на CSS 2.1 не ви позволяват да зададете максимална височина на клетка или ред на таблица. За да получите това, което искате, трябва да добавите съдържанието в div и да зададете CSS свойства за максимална височина и препълване на този div. Ето вашия модифициран пример (затворих в div елемент тази клетка с голямо съдържание):

<!DOCTYPE html>
<html>
  <head>
    <title></title>
    <style type="text/css">

      .withMaximumHeight {
      max-height :50px;
      overflow: hidden;

      }
    </style>
  </head>
  <body>
    <table>
      <thead>
        <tr>
          <th scope="col">
            calculrow
          </th>
          <th scope="col">
            doktyyp
          </th>
          <th scope="col">
            dokumnr
          </th>
          <th scope="col">
            fifoexpens
          </th>
          <th scope="col">
            hind
          </th>
          <th scope="col">
            klass
          </th>
          <th scope="col">
            kogpak
          </th>
          <th scope="col">
            kogus
          </th>
          <th scope="col">
            koopia
          </th>
          <th scope="col">
            nimetus
          </th>
          <th scope="col">
            paritoluri
          </th>
          <th scope="col">
            prepayment
          </th>
          <th scope="col">
            toode
          </th>
          <th scope="col">
            vat
          </th>
          <th scope="col">
            dokarvekonto
          </th>
          <th scope="col">
            dokeimuuda
          </th>
          <th scope="col">
            dokkrdokumnr
          </th>
          <th scope="col">
            dokkuupaev
          </th>
          <th scope="col">
            dokraha
          </th>
          <th scope="col">
            doksaaja
          </th>
          <th scope="col">
            doktasudok
          </th>
          <th scope="col">
            doktasukuup
          </th>
          <th scope="col">
            doktekst1
          </th>
          <th scope="col">
            klientaadress
          </th>
          <th scope="col">
            klientnimi
          </th>
          <th scope="col">
            klientotsekorral
          </th>
          <th scope="col">
            klientpiirkond
          </th>
          <th scope="col">
            klientpostiindek
          </th>
          <th scope="col">
            klienttanav
          </th>
          <th scope="col">
            klientviitenr
          </th>
          <th scope="col">
            kreeditdoktasudok
          </th>
          <th scope="col">
            maksetintingimus
          </th>
          <th scope="col">
            myygikookmprotsent
          </th>
          <th scope="col">
            myygikoomaksuvaba
          </th>
          <th scope="col">
            saajanimi
          </th>
          <th scope="col">
            saajapiirkond
          </th>
          <th scope="col">
            saajapostiindek
          </th>
          <th scope="col">
            saajatanav
          </th>
          <th scope="col">
            toodekaubakood
          </th>
          <th scope="col">
            toodeklass
          </th>
        </tr>
      </thead>
      <tbody>
        <tr>
          <td>False</td>
          <td>G</td>
          <td>2045</td>
          <td>False</td>
          <td>362,28813</td>
          <td>T</td>
          <td>0,0000</td>
          <td>2,0000</td>
          <td>1</td>
          <td>Siduri- ja piduriheebel kinnitustega              </td>
          <td></td>
          <td>0</td>
          <td>32-30100            </td>
          <td>1775,61</td>
          <td>112       </td>
          <td>False</td>
          <td>0</td>
          <td>27.11.2013 0:00:00</td>
          <td>EUR</td>
          <td></td>
          <td>359                      </td>
          <td>7.12.2013 0:00:00</td>
          <td>
            <div class="withMaximumHeight">
              Arve 988 26.01.2012
              Arve  16.08.2012
              Arve 290 16.08.2012
              Muu sissetulnud 24
              Muu sissetulnud 25 2
              Kassa sissetulek 8 4
              Tellimus 43 05.01.2012
              Tellimus 46 24.12.2011
              Arve 292 10.01.2013
              V&#228;ljastus 17.05.2013
              Arve 344 27.09.2013
              Arve 344 27.09.2013
              Arve 05.11.2013
              Tellimus 47 09.08.2013
              Arve 20.12.2013
            </div>
          </td>
          <td></td>
          <td>Acura UAB                                                                       </td>
          <td>767       </td>
          <td>                              </td>
          <td>          </td>
          <td>Huan Uh 2                                                   </td>
          <td>23445456            </td>
          <td></td>
          <td>10 p&#228;eva, viivis 0.5% p&#228;evas                      </td>
          <td>20,00</td>
          <td>False</td>
          <td>Acura UAB                                                                       </td>
          <td>                              </td>
          <td>          </td>
          <td>Huan Uh 2                                                   </td>
          <td></td>
          <td>     </td>
        </tr>
        <tr>
          <td>False</td>
          <td>G</td>
          <td>2045</td>
          <td>False</td>
          <td>0,43700</td>
          <td>T</td>
          <td>0,0000</td>
          <td>0,0000</td>
          <td>1</td>
          <td>Balti v&#252;rtsikilud 270g                            </td>
          <td></td>
          <td>0</td>
          <td>0075                </td>
          <td>1775,61</td>
          <td>112       </td>
          <td>False</td>
          <td>0</td>
          <td>27.11.2013 0:00:00</td>
          <td>EUR</td>
          <td></td>
          <td>359                      </td>
          <td>7.12.2013 0:00:00</td>
          <td>
            <div class="withMaximumHeight">
              Arve 988 26.01.2012
              Arve  16.08.2012
              Arve 290 16.08.2012
              Muu sissetulnud 24
              Muu sissetulnud 25 2
              Kassa sissetulek 8 4
              Tellimus 43 05.01.2012
              Tellimus 46 24.12.2011
              Arve 292 10.01.2013
              V&#228;ljastus 17.05.2013
              Arve 344 27.09.2013
              Arve 344 27.09.2013
              Arve 05.11.2013
              Tellimus 47 09.08.2013
              Arve 20.12.2013
            </div>
          </td>
          <td></td>
          <td>Acura UAB                                                                       </td>
          <td>767       </td>
          <td>                              </td>
          <td>          </td>
          <td>Huan Uh 2                                                   </td>
          <td>23445456            </td>
          <td></td>
          <td>10 p&#228;eva, viivis 0.5% p&#228;evas                      </td>
          <td>20,00</td>
          <td>False</td>
          <td>Acura UAB                                                                       </td>
          <td>                              </td>
          <td>          </td>
          <td>Huan Uh 2                                                   </td>
          <td></td>
          <td>     </td>
        </tr>
      </tbody>
    </table>

  </body>
</html>
  -  person M-WaJeEh    schedule 21.02.2013
comment
Не, само за тестване е 3000 :-)! Нека опитам това   -  person Harry    schedule 21.02.2013
comment
никога не сравнявайте Strings с помощта на оператор ==. Използвайте method.equals("new"); вместо това във вашия doInBackground() метод.   -  person M-WaJeEh    schedule 21.02.2013
comment
Все още не съм сигурен защо се случва това   -  person Harry    schedule 21.02.2013
comment
Не разбирам защо възпроизвеждането спира. можете ли да повторите това?   -  person Harry    schedule 21.02.2013
comment
А, мисля, че го имам. Класът Json прави това!   -  person Harry    schedule 21.02.2013
comment
Не беше това!! човек задачата изпълнява всичко. Но след като това е направено, по някаква причина мултимедийният плейър се прекъсва!!!   -  person Harry    schedule 22.02.2013
comment
проблемът ти решен ли е?   -  person Shreyash Mahajan    schedule 14.03.2013


Отговори (2)


Този въпрос беше зададен преди доста време. Но решението на проблема не е Async задача, а създаване на поле на MediaPlayer в класа, вместо да го прави като локална променлива към който и да е метод.

В момента във вашия случай това е част от метода private void playMedia(). Тъй като това е в метод, той отговаря на условията за събиране на боклук веднага щом методът приключи. Направете нещо подобно: -

public class MainActivity extends Activity implements OnCompletionListener {

   private MediaPlayer pl;  // This makes sure mediaplayer is there if activity is alive
person Himanshu Virmani    schedule 19.04.2014

Освободете медийния плейър, когато не се използва до mp.release();. Ще реши проблема ви.

Например

mp.setOnCompletionListener(new OnCompletionListener() {
    public void onCompletion(MediaPlayer mp) {    
        mp.release();
    }
});
person activesince93    schedule 07.01.2015