36

私は通知を使ってアプリを書いています。Google 開発者ガイドラインでは、開発者が通知をカスタマイズするための設定 (バイブレーションを無効にする、通知音を設定するなど) を提供することを推奨しているため、ユーザーがそのように設定した場合、通知のバイブレーションを無効にしようとしています。

NotificationCompat.Builder次のように、通知を作成するために使用しています。

NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(Application.getContext())
            .setDefaults(Notification.DEFAULT_ALL)
            .setPriority(Notification.PRIORITY_MAX)
            .setSmallIcon(R.drawable.ic_launcher)
            .setLargeIcon(largeIconBitmap)
            .setAutoCancel(true)
            .setContentIntent(resultPendingIntent)
            .setContentTitle(title)
            .setContentText(content);

通知を無効にするさまざまな方法を試しました:

notificationBuilder.setVibrate(null);

notificationBuilder.setVibrate(new long[]{0l, 0l});

notificationBuilder.setDefaults(Notification.DEFAULT_ALL | ~Notification.DEFAULT_VIBRATE);

notificationBuilder.setDefaults(Notification.DEFAULT_LIGHTS | Notification.DEFAULT_SOUND);`

また、通知を作成して、結果のオブジェクトの値を変更しようとしました。

Notification notification = notificationBuilder.build();
notification.vibrate = null;

ただし、通知が表示されると、電話はまだ振動します。

通知のバイブレーションを無効にするにはどうすればよいですか?

4

8 に答える 8

64

長い試行錯誤のセッションの後、ようやく何が問題なのか理解できたと思います。

問題はこの命令にありますnotificationBuilder.setDefaults(Notification.DEFAULT_ALL)

notificationBuilder.setVibrate()設定後に渡すパラメーターに関係なく、黙って破棄されDEFAULT_ALLます。Google の誰かが、よりも をDEFAULT_VIBRATE優先することに決めたに違いありません。setDefaultssetVibrate

これが、アプリで通知のバイブレーションを無効にする方法です。

notificationBuilder.setDefaults(Notification.DEFAULT_LIGHT | Notification.DEFAULT_SOUND)
                   .setVibrate(new long[]{0L}); // Passing null here silently fails

long[]これは機能しますが、振動を無効にするためだけに新しいものを初期化するのは適切ではありません。

于 2014-06-03T06:51:18.263 に答える
3

それらはあなたが使用"setDefaults(Notification.DEFAULT_ALL)"しているので停止しないので、振動と音を止める必要がある場合はこの行を削除するか、デフォルトの音と振動を使用する必要がある場合は、使用する必要があると思いますsetDefaults(Notification.DEFAULT_SOUND)...

于 2015-01-28T22:49:16.487 に答える
1

.setVibrate(null)私にとってはうまくいきます-そして、不必要な長い[]を作成するよりも良い解決策です。

結果: デバイスは振動せず、Lo​​gCat でも不平を言うことはありません。:)

于 2014-09-07T14:07:12.680 に答える
0

上記の解決策は機能しませんでしたがmBuilder.setOnlyAlertOnce(true);、通知ビルダーに追加すると問題が解決しました。

 if (mBuilder == null) {
            String channelId = "channel-id";
            String channelName = "Channel Name";
            int importance = NotificationManager.IMPORTANCE_MAX;
            if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
                NotificationChannel mChannel = new NotificationChannel(
                        channelId, channelName, importance);

                mChannel.setSound(null, null);
                mChannel.enableVibration(false);

                notificationManager.createNotificationChannel(mChannel);
            }
            mBuilder = new NotificationCompat.Builder(Application.context, channelId);
            mBuilder.setSmallIcon(R.drawable.ic_ulakbel)
                    .setContentTitle("YOURTITLE")
                    .setAutoCancel(true)
                    .setColor(ContextCompat.getColor(Application.context, R.color.green))
                    .setColorized(true);
            mBuilder.setChannelId(channelId);
            mBuilder.setPriority(1);
            mBuilder.setCustomContentView(notificationLayout);
            mBuilder.setCustomBigContentView(notificationLayout);
            mBuilder.setOnlyAlertOnce(true);
            notificationManager.notify(1452, mBuilder.build());
        }else{
            Notification notification = mBuilder.build();
            notification.flags = Notification.FLAG_ONGOING_EVENT;
            notificationManager.notify(1452,notification);
        }
于 2022-01-27T17:07:59.447 に答える