You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 05:27:31