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

时间:2019-09-11 16:08:24

标签: java android android-studio

编辑,感谢YP D's answer,我有一个解决方案。最后添加


自从将Pixel 3更新为android 10(API 29)版本以来,我的应用程序就无法正常工作。

我的应用程序请求振动许可,并且在早期版本(

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.VIBRATE" />

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

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

我的振动代码(durationMs是50,但我也用500进行了测试):

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的后台应用程序出现了问题。

如果是这样,我不确定应该采用哪种方法将振动传递到前景。

我已经考虑过使用Service进行后台工作,但是我发现在Handler线程上工作更容易,因此在完成计算后,我可以轻松找到Widget视图,并希望更新屏幕上的文本。


这是根据YPD的答案的解决方案

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似乎可以解决振动问题。

1 个答案:

答案 0 :(得分:1)

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

像这样

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);
}