我正在尝试在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
答案 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()