Android:从Kivy后台服务播放声音

时间:2014-12-02 05:54:04

标签: android python audio kivy

我正在尝试在Kivy for Android中创建一个简单的闹钟。

我已经在后台应用程序和用户界面(UI)之间进行了通信:后台应用程序正在指定的时间向UI发送数据。

但我无法从服务中产生声音或振动。它全部来自UI,但不是来自服务。

我确实从sound.play()尝试kivy.core.audio。我从logcat得到这个:

AttributeError: 'NoneType' object has no attribute 'Play'

如果我使用jnius振动,也是如此:

AttributeError: 'NoneType' object has no attribute 'getSystemService'

我确实尝试过用pyjnius this way和我的声音进行振动,就像我说的在UI上工作一样,这样:

from kivy.core.audio import SoundLoader
sound = SoundLoader.load('sound.wav')

然后:

sound.play()

更新

Lafadas的更新声音仍然无法播放,但错误后功能会继续,并且不会立即中断。

在logcat中我看到类似这样的东西,如果这是相关的:

Kivy service log:
    [INFO              ] Logger: Record log in /storage/emulated/0/org.alkoWatch/service/.kivy/logs/kivy_14-12-02_3.txt
[    INFO              ] Kivy v1.8.0
    [INFO              ] OSC: using <thread> for socket
    [INFO              ] Audio: Providers:  (audio_pygst, audio_sdl, audio_pygame ignored)
    [WARNING           ] Audio: Unable to find a loader for <sound.wav>
    [DEBUG             ] OSC: Start thread <0.0.0.0:3000>
    [INFO              ] OSC: listening for Tuio on 0.0.0.0:3000

3 个答案:

答案 0 :(得分:1)

您必须检查sound是否为None。如果是,则文件未加载。

来自load()的文档:

  

如果声音完成后声音应自动循环,则设为True

     

循环是BooleanProperty,默认为False

所以请检查它的值:

from kivy.core.audio import SoundLoader

sound = SoundLoader.load('sound.wav')
if sound:
    print("Sound found at %s" % sound.source)
    print("Sound is %.3f seconds" % sound.length)
    sound.play()

答案 1 :(得分:0)

解决方案是使用这种方法:

但它没有“开箱即用”。问题在这里描述: http://www.reddit.com/r/kivy/comments/2o2ws4/problem_with_running_a_service_on_android/ 用户在irc上创建并创建了一个解决方案。

问题出在178行的_android.pyx上。必须将代码片段替换为此片段:

https://gist.github.com/kived/c833c97bbd044e68515e

此外,我不得不排除这一行:#br.context = service /services/main.py中的服务并添加:

RingtoneManager = autoclass('android.media.RingtoneManager')
[...] notification_builder.setSound(RingtoneManager.getDefaultUri(RingtoneManager.TYPE_ALARM))

启用声音

答案 2 :(得分:0)

刚想出如何使用通知音量而不是普通媒体,这几乎总是很安静。 这就是我在android上发出python声音的好消息:

from jnius import autoclass
MediaPlayer = autoclass('android.media.MediaPlayer')
AudioManager = autoclass('android.media.AudioManager')
mPlayer = MediaPlayer()
mPlayer.setDataSource('/storage/sdcard0/Download/beep1.wav')
mPlayer.setAudioStreamType(AudioManager.STREAM_NOTIFICATION)
mPlayer.prepare()
mPlayer.start()
mPlayer.release()