首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >自API 29以来,小部件上的振动单击不起作用

自API 29以来,小部件上的振动单击不起作用
EN

Stack Overflow用户
提问于 2019-09-11 16:08:24
回答 1查看 1.6K关注 0票数 11

编辑多亏了YP D's answer,我有一个解决方案。加在末尾

自从我的Pixel 3升级到android版本10 (API 29)之后,我的应用程序的振动就无法工作了。

我的应用程序请求振动许可,并在早期版本(< API 29)上工作。权限:

代码语言:javascript
复制
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.VIBRATE" />

在将手机连接到Android并查看logcat时,我注意到以下错误:

代码语言:javascript
复制
2019-09-11 18:46:28.622 1474-1546/? E/NotificationService: Suppressing notification from package by user request.
2019-09-11 18:46:28.816 1474-3294/? E/VibratorService: Ignoring incoming vibration as process with uid = 10284 is background, usage = USAGE_UNKNOWN

我的振动代码(持续时间为50,但我也测试了500 ):

代码语言:javascript
复制
Vibrator v = (Vibrator) context.getSystemService(VIBRATOR_SERVICE);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
    v.vibrate(VibrationEffect.createOneShot(durationMs, VibrationEffect.DEFAULT_AMPLITUDE));
} else {
    v.vibrate(durationMs);
}

我是通过一个AppWidgetProvider类运行这段代码的,它使用Handler.postDelayed()线程来完成一些工作。

我在网上没有发现任何与这个问题有关的东西。我所假设的是,从API 29开始,VibratorService在后台应用程序上就有了问题。

如果是这样的话,我不知道我应该采取什么方法把振动带到前景。

我已经考虑过在后台工作使用一个服务,但是我发现在Handler线程上做工作更容易,所以在完成计算之后,我可以很容易地找到Widget视图,并希望更新屏幕上的文本。

以下是基于YP D的答案的解决方案

代码语言:javascript
复制
Vibrator v = (Vibrator) context.getSystemService(VIBRATOR_SERVICE);
AudioAttributes audioAttributes = new AudioAttributes.Builder()
        .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION)
        .setUsage(AudioAttributes.USAGE_ALARM)
        .build();
VibrationEffect ve = VibrationEffect.createOneShot(durationMs,
        VibrationEffect.DEFAULT_AMPLITUDE);
v.vibrate(ve, audioAttributes);

AudioAttributes似乎解决了振动问题。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-10-16 13:29:22

我也遇到了同样的问题,您可以使用以下方法来解决

像这样

代码语言:javascript
复制
Vibrator mVibrator = (Vibrator) App.getInstance().getSystemService(Context.VIBRATOR_SERVICE);
        long[] pattern = {100, 1000, 100, 1000};
        if (mVibrator != null) {
            AudioAttributes audioAttributes = new AudioAttributes.Builder()
                    .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION)
                    .setUsage(AudioAttributes.USAGE_ALARM) //key
                    .build();
            mVibrator.vibrate(pattern, 2, audioAttributes);
}
票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57893054

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档