当前位置: 首页 > 知识库问答 >
问题:

如何解决HttpURLConnection上的空点异常?

桓瀚
2023-03-14

我正在开发一个Android应用程序,使用ExoPlayer用于视频播放,Glide用于图像显示,以及用于文件下载的下载库,并且它们都具有与HttpURLConnection相关的NullPointerExctive,我确信使用的链接是可用的。

神奇的是,我只是按照这些库的官方留档中描述的方法正常加载数据,这种错误时有发生,三个库可能不会同时抛出NullPointerExctive,我甚至不知道如何重现这个问题。

这是ExoPlayer引发的错误,导致无法加载视频:

E/LoadTask: Unexpected exception loading stream
      java.lang.NullPointerException: wrapped.getHeaderField(key) must not be null
        at com.android.tools.appinspection.network.httpurl.TrackedHttpURLConnection.getHeaderField(TrackedHttpURLConnection.kt:317)
        at com.android.tools.appinspection.network.httpurl.HttpsURLConnectionWrapper.getHeaderField(HttpsURLConnectionWrapper.kt:182)
        at com.google.android.exoplayer2.upstream.DefaultHttpDataSource.isCompressed(DefaultHttpDataSource.java:829)
        at com.google.android.exoplayer2.upstream.DefaultHttpDataSource.open(DefaultHttpDataSource.java:413)
        at com.google.android.exoplayer2.upstream.StatsDataSource.open(StatsDataSource.java:84)
        at com.google.android.exoplayer2.source.ProgressiveMediaPeriod$ExtractingLoadable.load(ProgressiveMediaPeriod.java:1009)
        at com.google.android.exoplayer2.upstream.Loader$LoadTask.run(Loader.java:412)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
        at java.lang.Thread.run(Thread.java:923)

代码的视频播放部分如下所示:

            val factory = ProgressiveMediaSource.Factory(
                DefaultHttpDataSource.Factory()
            )
            val mediaSource = arrayListOf<MediaSource>(
                factory.createMediaSource(MediaItem.fromUri(video.base_url)),
                factory.createMediaSource(MediaItem.fromUri(audio.base_url))
            )
            val media = MergingMediaSource(true, *mediaSource.toTypedArray())
            ViewModel.getPlayer()?.let { player ->
                player.setMediaSource(media)
                player.prepare()
            }

下面是我使用的所有依赖和插件:

...
plugins {
    val androidVer = "7.1.2"
    id("com.android.application") version androidVer apply false
    id("com.android.library") version androidVer apply false

    val kotlinVer = "1.6.20-M1"
    id("org.jetbrains.kotlin.android") version kotlinVer apply false
    id("org.jetbrains.kotlin.plugin.parcelize") version kotlinVer apply false
    id("org.jetbrains.kotlin.kapt") version kotlinVer apply false
}
...
dependencies {
    implementation("androidx.test.ext:junit-ktx:1.1.3")
    testImplementation("junit:junit:4.13.2")
    androidTestImplementation("androidx.test.ext:junit:1.1.3")
    androidTestImplementation("androidx.test.espresso:espresso-core:3.4.0")
    androidTestImplementation("androidx.test:runner:1.4.0")
    androidTestImplementation("androidx.test:rules:1.4.0")

    implementation("androidx.core:core-ktx:1.7.0")
    implementation("androidx.appcompat:appcompat:1.4.1")
    implementation("com.google.android.material:material:1.5.0")
    implementation("androidx.constraintlayout:constraintlayout:2.1.3")
    implementation("androidx.swiperefreshlayout:swiperefreshlayout:1.1.0")
    implementation("androidx.navigation:navigation-fragment-ktx:2.4.1")

    implementation("com.github.zhpanvip.BannerViewPager:bannerview:2.6.6")
    implementation("com.squareup.okhttp3:okhttp:5.0.0-alpha.5")
    implementation("com.yanzhenjie:sofia:1.0.5")
    implementation("com.github.SGPublic:Blur-Fix-AndroidX:1.1.2")
    implementation("com.github.SGPublic:MultiWaveHeaderX:1.0.0")
    implementation("com.github.li-xiaojun:XPopup:2.7.5")
    implementation("com.google.zxing:core:3.4.1")
    implementation("com.google.code.gson:gson:2.9.0")

    val glideVer = "4.13.1"
    implementation("com.github.bumptech.glide:glide:$glideVer")
    annotationProcessor("com.github.bumptech.glide:compiler:$glideVer")
    kapt("com.github.bumptech.glide:compiler:$glideVer")
    implementation("jp.wasabeef:glide-transformations:4.3.0")

    val exoVer = "2.17.0"
    implementation("com.google.android.exoplayer:exoplayer-core:$exoVer")
    implementation("com.google.android.exoplayer:exoplayer-dash:$exoVer")
    implementation("com.google.android.exoplayer:exoplayer-ui:$exoVer")

    val roomVer = "2.4.2"
    implementation("androidx.room:room-runtime:$roomVer")
    implementation("androidx.room:room-ktx:$roomVer")
    annotationProcessor("androidx.room:room-compiler:$roomVer")
    kapt("androidx.room:room-compiler:$roomVer")
    testImplementation("androidx.room:room-testing:$roomVer")

    val ariaVer = "3.8.12"
    implementation("com.arialyy.aria:core:$ariaVer")
    annotationProcessor("com.arialyy.aria:compiler:$ariaVer")
    kapt("com.arialyy.aria:compiler:$ariaVer")
}
...

我尝试过失效和重启,甚至完全卸载和重新安装了Android Studio,但问题仍然无法解决,那么问题是什么?

共有1个答案

陶博耘
2023-03-14

亲爱的使用这个库来播放youtube视频,它令人惊叹,易于使用和管理,这是在应用程序中播放youtube视频的最佳方式

    implementation 'com.pierfrancescosoffritti.androidyoutubeplayer:chromecast-sender:0.23'

清单(如果你想使用全屏视频播放)

  <activity
   android:name="com.pksofterltd.videoislamapp.Activities.LiveVideo"
   android:exported="true"
       android:configChanges="keyboard|keyboardHidden|orientation|screenSize|screenLayout|smallestScreenSize|uiMode">

        </activity>

XML

<com.pierfrancescosoffritti.androidyoutubeplayer.core.player.views.YouTubePlayerView
        android:id="@+id/youtube_player_view"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:showYouTubeButton="false" /

JAVA

  YouTubePlayerView youTubePlayerView;
    YouTubePlayer youTubePlr;

 @Override
    protected void onCreate(Bundle savedInstanceState) {
        youTubePlayerView = findViewById(R.id.youtube_player_view);

// link of video https://www.youtube.com/watch?v=HoJtAI0B-Bw
// you just use video ID insted on complete URL .video id you find at the end of url
// here is video ID is "HoJtAI0B-Bw" 

        play("HoJtAI0B-Bw");


}
public void play(String url){
        getLifecycle().addObserver(youTubePlayerView);


        youTubePlayerView.addFullScreenListener(new YouTubePlayerFullScreenListener() {
            @Override
            public void onYouTubePlayerEnterFullScreen() {
                setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
                getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN);
            }

            @Override
            public void onYouTubePlayerExitFullScreen() {
                setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
                getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_VISIBLE);

            }
        });
        youTubePlayerView.addYouTubePlayerListener(new AbstractYouTubePlayerListener() {
            @Override
            public void onReady(@NonNull YouTubePlayer youTubePlayer) {
                youTubePlr =youTubePlayer;
                
                    youTubePlr.loadVideo(url,0);
                





            }
        });
    }
 类似资料:
  • 如何使用实现以下功能? 这是完全不一样的,我实际上如何解决?

  • 未处理 异常: java.io.FileNotFoundException 测试过文件存在,但放在Scanner里面报错。有佬能帮忙分析下吗

  • 以下是我的项目结构的一部分: 我有init.sql脚本,它应该创建用户、数据库和表(用户和数据库与docker-compose.yml文件中的相同) 但当我查看docker entrypoint initdb.d文件夹时,它是空的(没有init.sql文件)。我使用以下命令: docker exec最新发布的\u postgres-passport\u 1 ls-l docker入口点initdb

  • 我正在尝试将50000条记录插入到一个五节点的卡桑德拉集群中。我正在使用执行异步以提高性能(减少应用程序端的插入时间)。我尝试了具有多个批处理大小的批处理语句,但每次我都遇到以下异常。 我插入了数据,即10000,20000到40000条记录,没有任何问题。以下是我编写的java代码。 其中ps是准备好的语句,batches是批数,batchSize是批中的记录数。 我无法理解这个问题的根本原因。

  • 我的 centos7 虚拟机中安装的 wiki.js + postgresql 运行初始化页面时出现下面提示,要如何解决