Java Exoplayer活动不播放视频,而是播放它';它显示一个空屏幕

Java Exoplayer活动不播放视频,而是播放它';它显示一个空屏幕,java,android,hlsl,exoplayer,Java,Android,Hlsl,Exoplayer,我是android studio的新手,在开发者指南的帮助下,我创建了这个exoplayer活动,但它没有播放视频,而是显示了一个空屏幕。我在MainActivity中创建了一个按钮,当我单击该按钮时,它将打开此播放器活动并播放我的hls流媒体。请帮忙 我的播放器活动.java package com.example.mystream; import androidx.appcompat.app.AppCompatActivity; import android.net.Uri; i

我是android studio的新手,在开发者指南的帮助下,我创建了这个
exoplayer活动
,但它没有播放视频,而是显示了一个空屏幕。我在MainActivity中创建了一个
按钮
,当我单击该按钮时,它将打开此播放器活动并播放我的hls流媒体。请帮忙

我的播放器活动.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();
    }
}
My 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>

问题似乎就在这两方面

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

这将解决您的问题。

以下是您需求的详细说明

检查网络连接的方法

权限


你看不到日志里有什么东西吗?如果有,请邮寄here@VirRajpurohit请检查错误消息Koteswara Raoha检查我的回答它正在工作,但API 28和API 29还有另一个问题,我的流没有在这28,29 API中播放,但在24,25,26,27中工作得很好。你能帮忙吗?我正在更新错误消息。@ChavaKoteswaraRao,这是因为安全策略更新。尝试在manifest file.OMG的应用程序标记中添加android:usesCleartextTraffic=“true”!它像冠军一样工作。非常感谢你。你让我开心,节省了很多时间和痛苦。太棒了!我很感激你能帮助你。快乐编码!在启动exoplayer之前,我需要检查互联网连接。我已经更新了我的代码,请看一下。我的目标是,如果没有互联网,它应该显示“请连接互联网”,如果有互联网,它应该播放我的exoplayer。请提供帮助。NetworkInfo、getActiveNetworkInfo、getType、TYPE\u WIFI、TYPE\u MOBILE不推荐使用。我正在使用min sdk 16和targeted sdk 29。当我在本活动中单击“后退”按钮时,请参考此答案。它不会转到上一个活动,而是正在关闭。你能帮忙吗?检查一下你是否写了finish();在上一个活动的意图代码中。如果是,请将其移除。这些也是android的一些基础知识。我建议先深入研究一下这些东西。你能看看我最近更新的主要活动吗。正如你所建议的,我将看一下基础知识。非常感谢您抽出时间。解决这个问题。
HlsMediaSource hlsMediaSource =new HlsMediaSource.Factory(dataSourceFactory).createMediaSource(uri); 
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()
}