Kotlin开发Android应用无界面显示,附报错及代码求助
问题排查与解决方案
1. 屏幕无内容显示的核心原因(布局解析失败)
你的布局文件amogusfile.xml末尾有一个多余的反斜杠\,这会触发XML解析异常,导致系统无法正确加载布局,最终屏幕显示空白。
修复方法:删除XML文件最后一行的\,修正后的布局代码如下:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingLeft="16dp" android:paddingRight="16dp" android:orientation="vertical" tools:ignore="ExtraText"> <Button android:id="@+id/supabutton" android:layout_width="match_parent" android:layout_height="match_parent" android:text="@string/amogus" tools:ignore="VisualLintButtonSize" /> </LinearLayout>
2. MediaPlayer的致命问题(会引发崩溃/主线程阻塞)
你在全局作用域直接初始化mediaPlayer并调用prepare()和start(),存在两个严重问题:
- 全局初始化会在应用启动时就执行耗时的网络操作,直接阻塞主线程导致ANR(应用无响应)
- YouTube网页URL并非可直接播放的音频/视频流,MediaPlayer无法解析该链接
修复方法:
- 将MediaPlayer初始化移至Activity内部,使用异步方法
prepareAsync()避免阻塞主线程 - 替换YouTube链接为有效的音频流URL(如MP3直链),或使用YouTube官方SDK实现播放
- 仅在用户点击按钮时触发播放逻辑
修正后的MainActivity代码:
package com.example.myapplication import android.app.Activity import android.media.AudioAttributes import android.media.MediaPlayer import android.os.Bundle import android.widget.Button import android.widget.Toast class MyActivity : Activity() { private lateinit var mediaPlayer: MediaPlayer override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.amogusfile) // 初始化MediaPlayer仅做配置,不立即准备播放 mediaPlayer = MediaPlayer().apply { setAudioAttributes( AudioAttributes.Builder() .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC) .setUsage(AudioAttributes.USAGE_MEDIA) .build() ) setOnPreparedListener { it.start() } setOnErrorListener { _, what, extra -> Toast.makeText(this@MyActivity, "播放失败: $what $extra", Toast.LENGTH_SHORT).show() true } } val button = findViewById<Button>(R.id.supabutton) button.setOnClickListener { try { // 替换为实际可播放的音频流URL mediaPlayer.setDataSource("https://example.com/your-audio-stream.mp3") mediaPlayer.prepareAsync() } catch (e: Exception) { Toast.makeText(this, "设置数据源失败: ${e.message}", Toast.LENGTH_SHORT).show() } } } override fun onDestroy() { super.onDestroy() mediaPlayer.release() // 释放MediaPlayer资源,避免内存泄漏 } }
3. 关于报错Access denied finding property "ro.vendor.pref_scale_resolution"
这是设备厂商的私有系统属性访问警告,属于系统级日志,不会影响应用的UI显示或核心功能,无需特殊处理。
内容的提问来源于stack exchange,提问作者Monzel
相关产品推荐
相关产品推荐

