Активность Exoplayer не воспроизводит видео, вместо этого показывает пустой экран

Я новичок в студии Android, с помощью руководства для разработчиков я создал этот exoplayer activity, но он не воспроизводит видео, а показывает пустой экран. Я создал button в своей MainActivity, когда я нажимаю эту кнопку, она должна открыть эту активность игрока и воспроизвести мою потоковую передачу hls. Пожалуйста помоги

Мой проигрыватель activity.java

    package com.example.mystream;


import androidx.appcompat.app.AppCompatActivity;
import android.net.Uri;
import android.os.Bundle;
import android.view.WindowManager;
import com.google.android.exoplayer2.ExoPlayerFactory;
import com.google.android.exoplayer2.SimpleExoPlayer;
import com.google.android.exoplayer2.source.hls.HlsMediaSource;
import com.google.android.exoplayer2.ui.PlayerView;
import com.google.android.exoplayer2.upstream.DataSource;
import com.google.android.exoplayer2.upstream.DefaultHttpDataSourceFactory;
import com.google.android.exoplayer2.util.Util;


public class playlive extends AppCompatActivity {


    private SimpleExoPlayer player;
    private PlayerView playerView;

    private Uri uri;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_playlive);

        this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
        this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON, WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
        try {
            this.getSupportActionBar().hide();
        } catch (Exception e) {

        }


    }

    private void play() {
        SimpleExoPlayer player = ExoPlayerFactory.newSimpleInstance(this);
        playerView = findViewById(R.id.player_view);
        playerView.setPlayer(player);
        uri = Uri.parse("http://localhost:1935/live/mystream/index.m3u8");
        DataSource.Factory dataSourceFactory =
                new DefaultHttpDataSourceFactory(Util.getUserAgent(this, "app-name"));
// Create a HLS media source pointing to a playlist uri.
        HlsMediaSource hlsMediaSource =
                new HlsMediaSource.Factory(dataSourceFactory).createMediaSource(uri);


        player.prepare(hlsMediaSource);
        player.setPlayWhenReady(true);
    }

    public void onStart(){
        super.onStart();
        play();
    }

    public void onStop(){
        super.onStop();
        onBackPressed();
        player.release();
    }

    public void onDestroy(){
        super.onDestroy();
        onBackPressed();
        player.release();
    }
}

Мой playlive .xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".playlive">

    <com.google.android.exoplayer2.ui.PlayerView
        android:id="@+id/exo_buffering"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:focusable="true"
        app:resize_mode="fill"
        />

</androidx.constraintlayout.widget.ConstraintLayout>

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

package com.example.mystream;


import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.WindowManager;
import android.widget.Button;


public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);


        this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);
        try {
            this.getSupportActionBar().hide();
        }catch (Exception e){

        }

        Button button = findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent activity2Intent = new Intent(getApplicationContext(), playlive.class);
                startActivity(activity2Intent);

            }
        });


    }



}

person Chava Koteswara Rao    schedule 30.10.2019    source источник
comment
разве вы не видите ничего напечатанного в журналах? Если есть то напишите сюда   -  person Vir Rajpurohit    schedule 30.10.2019
comment
@VirRajpurohit, пожалуйста, проверьте сообщение об ошибке   -  person Chava Koteswara Rao    schedule 30.10.2019
comment
Котешвара Раоха Проверьте мой ответ   -  person Vir Rajpurohit    schedule 30.10.2019


Ответы (2)


Проблема кажется в этих двух строках

HlsMediaSource hlsMediaSource =new HlsMediaSource.Factory(dataSourceFactory).createMediaSource(uri); 
uri= Uri.parse("http://localhost:1935/live/mystream/index.m3u8");

Вы пытаетесь передать uri перед инициализацией, что вызывает проблему.

попробуйте инициализировать до, как показано ниже

uri= Uri.parse("http://localhost:1935/live/mystream/index.m3u8");

а затем использовать его

HlsMediaSource hlsMediaSource =new HlsMediaSource.Factory(dataSourceFactory).createMediaSource(uri); 

Это должно решить вашу проблему.

person Vir Rajpurohit    schedule 30.10.2019
comment
Это работает, но есть еще одна проблема с API 28 и API 29, мой поток не воспроизводится в этих 28,29 API, но работает очень хорошо для 24,25,26,27. Не могли бы вы помочь? Я обновляю сообщение об ошибке. - person Chava Koteswara Rao; 30.10.2019
comment
@ChavaKoteswaraRao Это из-за обновления политики безопасности. Попробуйте добавить android:usesCleartextTraffic=true в тег приложения в файле манифеста. - person Vir Rajpurohit; 30.10.2019
comment
МОЙ БОГ! это сработало как чемпион. Большое спасибо. Вы сделали мой день и сэкономили много времени и боли. - person Chava Koteswara Rao; 30.10.2019
comment
Большой! обязан, как смог помочь вам. Удачного кодирования! - person Vir Rajpurohit; 31.10.2019
comment
Мне нужно проверить подключение к Интернету перед запуском exoplayer. Я обновил свой код, пожалуйста, посмотрите сразу. Моя цель: если нет Интернета, он должен отображать, пожалуйста, подключите Интернет, и если интернет есть, он должен играть в мой экзоплеер. Пожалуйста помоги. - person Chava Koteswara Rao; 01.11.2019
comment
@ChavaKoteswaraRao Я добавил еще один ответ. Пожалуйста, проверьте. - person Vir Rajpurohit; 01.11.2019

Вот подробное описание вашего требования.

Способ проверки сетевого соединения

private boolean checkConnection(Context context) 
    {
        final ConnectivityManager mConnMngr= (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);

        if (mConnMngr!= null) {
            NetworkInfo mNetworkInfo = mConnMngr.getActiveNetworkInfo();

            if (mNetworkInfo != null) {
                if ((mNetworkInfo .getType() == ConnectivityManager.TYPE_WIFI) {
                    return true;
                } else return mNetworkInfo.getType() == ConnectivityManager.TYPE_MOBILE;
            }
        }
        return false;
    }

Разрешения

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

Применение

if (checkConnection(context)) {
   play(); 
} else {
   Toast.makeText(context,"No internet available!",Toast.LENGTH_LONG).show()
}
person Vir Rajpurohit    schedule 01.11.2019
comment
NetworkInfo, getActiveNetworkInfo, getType, TYPE_WIFI, TYPE_MOBILE устарели. Я использую минимальный SDK 16 и целевой SDK 29. - person Chava Koteswara Rao; 01.11.2019
comment
обратитесь к этому ответу stackoverflow.com/a/53932141/6997819 - person Vir Rajpurohit; 01.11.2019
comment
Когда я нажимаю кнопку «Назад» в этом действии, оно не переходит к предыдущему действию, а закрывается. Вы можете помочь? - person Chava Koteswara Rao; 01.11.2019
comment
Проверьте, написали ли вы finish(); в коде намерения в предыдущем действии. Если это так, удалите его. Также это некоторые основы Android. Я предлагаю сначала глубоко погрузиться в эти вещи. - person Vir Rajpurohit; 01.11.2019
comment
Не могли бы вы взглянуть на основную активность, которую я недавно обновил. Как вы предложили, я буду смотреть на основы. Большое вам спасибо за ваше время. Исправьте эту проблему. - person Chava Koteswara Rao; 01.11.2019