Android Studio (Kotlin) 中广播、广播接收器和服务的问题

问题描述

我的小部件有问题。我使用广播在其中启动服务,但实际上我的服务从未使用过,我不知道为什么。也许你会帮助我。 这是我的服务。它应该是类似音频播放器的东西。音频文件为 .ogg 格式,位于我创建的原始文件夹中:

package com.example.projekt1_smb2

import android.app.Service
import android.content.broadcastReceiver
import android.content.Context
import android.content.Intent
import android.content.IntentFilter
import android.media.MediaPlayer
import android.media.MediaPlayer.*
import android.os.Binder
import android.os.IBinder
import android.util.Log
import android.widget.Toast
import java.io.IOException

class MediaPlayerService : Service(),OnCompletionListener {
    private val iBinder: IBinder = LocalBinder()
    private lateinit var mediaPlayer: MediaPlayer
    private var songId = 1

    private fun setSong(songId: Int) {
        mediaPlayer.reset()
        val assetFileDescriptor = resources.openRawResourceFd(resources.getIdentifier("song$songId","raw",packageName))
        try {
            mediaPlayer.setDataSource(
                    assetFileDescriptor.fileDescriptor,assetFileDescriptor.startOffset,assetFileDescriptor.length
            )
            assetFileDescriptor.close()
            mediaPlayer.prepare()
            Log.d("setSong","You set a song!")
        } catch (e: IOException) {
            e.printstacktrace()
        }
    }

    private fun initMediaPlayer() {
        mediaPlayer = MediaPlayer()
        mediaPlayer.setonCompletionListener(this)
        setSong(songId)
    }

    private fun play() {
        if (!mediaPlayer.isPlaying) {
            mediaPlayer.start()
            Log.d("play","You played a song! New SongId$songId")
        }
    }

    private fun pause() {
        if (mediaPlayer.isPlaying) {
            mediaPlayer.pause()
            Log.d("pause","You paused a song!")
        }
    }

    private fun stop() {
        if (mediaPlayer.isPlaying) {
            mediaPlayer.stop()
            setSong(songId)
            Log.d("stop","You stoped a song!")
        }
    }

    private fun back() {
        if (songId > 1) {
            songId = songId.minus(1)
            if (!mediaPlayer.isPlaying) {
                mediaPlayer.stop()
            }
            setSong(songId)
            mediaPlayer.start()
            Log.d("back","You changed your song to prevIoUs one! New SongId$songId")
        }
        else
            songId = songId.plus(1)
            if (!mediaPlayer.isPlaying) {
                mediaPlayer.stop()
            }
            setSong(songId)
            mediaPlayer.start()
            Log.d("return1","You returned to old song! New SongId$songId")
    }

    private fun skip() {
        if (songId < 2) {
            songId = songId.plus(1)
            if (!mediaPlayer.isPlaying) {
                mediaPlayer.stop()
            }
            setSong(songId)
            mediaPlayer.start()
            Log.d("skip","You skiped a song! New SongId$songId")
        }
        else
            songId = songId.minus(1)
            if (!mediaPlayer.isPlaying) {
                mediaPlayer.stop()
            }
            setSong(songId)
            mediaPlayer.start()
            Log.d("return","You returned to old song! New SongId$songId")
    }

    private val audioPlayer: broadcastReceiver = object : broadcastReceiver() {
        override fun onReceive(context: Context,intent: Intent) {
            if (intent.action == null) return
            when (intent.getStringExtra("button")) {
                applicationContext.getString(R.string.actionBtPlay) -> play()
                applicationContext.getString(R.string.actionBtPause) -> pause()
                applicationContext.getString(R.string.actionBtNext) -> skip()
                applicationContext.getString(R.string.actionBtPrevIoUs) -> back()
                applicationContext.getString(R.string.actionBtStop) -> stop()
            }
            Log.d("broadCastReceiver","broadCastReceiver")
        }
    }

    private fun registeraudioPlayer() {
        val filter = IntentFilter(getString(R.string.broadcast_test))
        registerReceiver(audioPlayer,filter)
        Log.d("broadCastReceivers","broadCastReceiverxdddd")
    }

    override fun onBind(intent: Intent?): IBinder {
        return iBinder
    }

    override fun onCreate() {
        super.onCreate()
        registeraudioPlayer()
        Log.d("onCreate","onCreate")
    }

    override fun onCompletion(mp: MediaPlayer?) {
        mp?.stop()
        setSong(songId)
        Log.d("onCompletion","onCompletion")
    }

    override fun onDestroy() {
        super.onDestroy()
        stop()
        mediaPlayer.release()
        unregisterReceiver(audioPlayer)
        Log.d("onDestroy","onDestroy")
    }

    override fun onStartCommand(intent: Intent?,flags: Int,startId: Int): Int {
        initMediaPlayer()
        Log.d("onStartCommand","onStartCommand")
        return super.onStartCommand(intent,flags,startId)
    }

    inner class LocalBinder : Binder() {
        val service
            get() = this@MediaPlayerService
    }
}

接下来是我的小部件代码。它显示了在服务中用于播放、暂停等音乐的按钮:

package com.example.projekt1_smb2

import android.app.PendingIntent
import android.appwidget.AppWidgetManager
import android.appwidget.appwidgetprovider
import android.content.ComponentName
import android.content.Context
import android.content.Intent
import android.net.Uri
import android.util.Log
import android.widget.RemoteViews
import android.widget.Toast

/**
 * Implementation of App Widget functionality.
 */
class NewAppWidget : appwidgetprovider() {

    override fun onUpdate(context: Context,appWidgetManager: AppWidgetManager,appWidgetIds: IntArray) {
        // There may be multiple widgets active,so update all of them
        val views = RemoteViews(context.packageName,R.layout.new_app_widget)
        views.setTextViewText(R.id.appwidget_text,context.getString(R.string.appwidget_text))
        for (appWidgetId in appWidgetIds) {
            updateAppWidget(context,appWidgetManager,appWidgetId,1,views)
        }
    }

    override fun onReceive(context: Context?,intent: Intent?) {
        super.onReceive(context,intent)
        if (intent?.action.equals(context?.getString(R.string.actionBtPrevIoUs)) ||
                intent?.action.equals(context?.getString(R.string.actionBtPlay)) ||
                intent?.action.equals(context?.getString(R.string.actionBtPause)) ||
                intent?.action.equals(context?.getString(R.string.actionBtStop)) ||
                intent?.action.equals(context?.getString(R.string.actionBtNext))) {
            val broadcastIntent = Intent(context?.getString(R.string.broadcast_test))
            broadcastIntent.putExtra("button",intent?.action)
            context?.sendbroadcast(broadcastIntent)
        }
    }
}

internal fun updateAppWidget(context: Context,appWidgetId: Int,imgId: Int,views: RemoteViews) {
    var requestCode = 0

    val intentMusicPrev = Intent(context?.getString(R.string.actionBtPrevIoUs))
    intentMusicPrev.component = ComponentName(context,NewAppWidget::class.java)
    val pendingIntentMusicPrev = PendingIntent.getbroadcast(
            context,requestCode++,intentMusicPrev,PendingIntent.FLAG_UPDATE_CURRENT
    )
    views.setonClickPendingIntent(R.id.buttonPrevIoUs,pendingIntentMusicPrev)

    val intentMusicPlay = Intent(context.getString(R.string.actionBtPlay))
    intentMusicPlay.component = ComponentName(context,NewAppWidget::class.java)
    val pendingIntentMusicPlay = PendingIntent.getbroadcast(
            context,intentMusicPlay,PendingIntent.FLAG_UPDATE_CURRENT
    )
    views.setonClickPendingIntent(R.id.buttonPlay,pendingIntentMusicPlay)

    val intentMusicPause = Intent(context.getString(R.string.actionBtPause))
    intentMusicPause.component = ComponentName(context,NewAppWidget::class.java)
    val pendingIntentMusicPause = PendingIntent.getbroadcast(
            context,intentMusicPause,PendingIntent.FLAG_UPDATE_CURRENT
    )
    views.setonClickPendingIntent(R.id.buttonPause,pendingIntentMusicPause)

    val intentMusicStop = Intent(context.getString(R.string.actionBtStop))
    intentMusicStop.component = ComponentName(context,NewAppWidget::class.java)
    val pendingIntentMusicStop = PendingIntent.getbroadcast(
            context,intentMusicStop,PendingIntent.FLAG_UPDATE_CURRENT
    )
    views.setonClickPendingIntent(R.id.buttonStop,pendingIntentMusicStop)

    val intentMusicNext = Intent(context.getString(R.string.actionBtNext))
    intentMusicNext.component = ComponentName(context,NewAppWidget::class.java)
    val pendingIntentMusicNext = PendingIntent.getbroadcast(
            context,intentMusicNext,PendingIntent.FLAG_UPDATE_CURRENT
    )
    views.setonClickPendingIntent(R.id.buttonNext,pendingIntentMusicNext)


    // Instruct the widget manager to update the widget
    appWidgetManager.updateAppWidget(appWidgetId,views)

最后在 Manifest 中声明服务。它在应用程序部分:

<service android:name=".MediaPlayerService" />

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)