问题描述
我的小部件有问题。我使用广播在其中启动服务,但实际上我的服务从未使用过,我不知道为什么。也许你会帮助我。 这是我的服务。它应该是类似音频播放器的东西。音频文件为 .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 (将#修改为@)