web-dev-qa-db-ja.com

Android通知setSoundが機能していません

私のハイブリッドCordova AndroidアプリターゲティングAPI 23+では、通知にカスタムサウンドを使用します。そのために、次のことを行いました。

  • アプリで使用する単一のカスタムプラグインのplugin.xmlファイルで、<resource-file src="src/Android/res/unysound.mp3" target="res/raw/mysound.mp3" />'を宣言します。

APKをZipアーカイブとして開くと、実際にはmp3ファイルが `res/raw/mysound.mp3 'になっていることがわかります。 -通知を作成するとき、私は次のことを行います

    Notification notification = new Notification.Builder(context)
    .setDefaults(0) //turns off ALL defaults
    .setVibrate(vibrate)  /sets to vibrate
    ....
    .setSound(uri).build();

どこで

Uri uri = Uri.parse("Android.resource://" + ctxt.getPackageName() + "/raw/mysound.mp3");

これは、グーグルのスポットやSOの他のスレッドで見つけた多くの記事で示されているレシピのようです。それでも、通知を発行しても、期待した音が聞こえません。何が間違っているのでしょうか?


APKを構築しようとするカスタムプラグインを使用するハイブリッドCordovaアプリのコンテキストでは、class R not known/found...の行に沿ってエラーがスローされるため、以下の答えは役に立ちません。

14
DroidOS

以下のコードが役立ちます:

String CHANNEL_ID="1234";

Uri soundUri = Uri.parse(ContentResolver.SCHEME_Android_RESOURCE + "://"+ getApplicationContext().getPackageName() + "/" + R.raw.mysound);

NotificationManager mNotificationManager = (NotificationManager) getApplicationContext().getSystemService(Context.NOTIFICATION_SERVICE);

API 26+の場合、以下のような追加のコードを追加する必要があります。

NotificationChannel mChannel;
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            mChannel = new NotificationChannel(CHANNEL_ID, Utils.CHANNEL_NAME, NotificationManager.IMPORTANCE_HIGH);
            mChannel.setLightColor(Color.GRAY);
            mChannel.enableLights(true);
            mChannel.setDescription(Utils.CHANNEL_SIREN_DESCRIPTION);
            AudioAttributes audioAttributes = new AudioAttributes.Builder()
                    .setContentType(AudioAttributes.CONTENT_TYPE_NOTIFICATION)
                    .setUsage(AudioAttributes.USAGE_NOTIFICATION)
                    .build();
            mChannel.setSound(soundUri, audioAttributes);

            if (mNotificationManager != null) {
                mNotificationManager.createNotificationChannel( mChannel );
            }
    }

一般的なコード:

 NotificationCompat.Builder status = new NotificationCompat.Builder(getApplicationContext(),CHANNEL_ID);     
                      status.setAutoCancel(true)
                            .setWhen(System.currentTimeMillis())
                            .setSmallIcon(R.drawable.logo)
                            //.setOnlyAlertOnce(true)
                            .setContentTitle(getString(R.string.app_name))
                            .setContentText(messageBody)
                            .setVibrate(new long[]{0, 500, 1000})
                            .setDefaults(Notification.DEFAULT_LIGHTS )
                            .setSound(Uri.parse(ContentResolver.SCHEME_Android_RESOURCE+ "://" +mContext.getPackageName()+"/"+R.raw.Apple_ring))
                            .setContentIntent(pendingIntent)
                            .setContent(views);

                    mNotificationManager.notify(major_id, status.build());

ここで、mysoundはres/rawフォルダーの下に置かれる私の着信音です。

raw/mysoundのような拡張子のない着信音の名前のみを入力する必要があります

14
Ketan Patel

API 26以降の場合、通知チャネルでサウンドを設定する必要があります。

Uri soundUri = Uri.parse(ContentResolver.SCHEME_Android_RESOURCE + "://"+ getApplicationContext().getPackageName() + "/" + R.raw.siren);
NotificationManager mNotificationManager = (NotificationManager) getApplicationContext().getSystemService(Context.NOTIFICATION_SERVICE);
    NotificationChannel mChannel;
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            mChannel = new NotificationChannel(Utils.CHANNEL_SIREN_ID, Utils.CHANNEL_SIREN_NAME, NotificationManager.IMPORTANCE_HIGH);
            mChannel.setLightColor(Color.GRAY);
            mChannel.enableLights(true);
            mChannel.setDescription(Utils.CHANNEL_SIREN_DESCRIPTION);
            AudioAttributes audioAttributes = new AudioAttributes.Builder()
                    .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION)
                    .setUsage(AudioAttributes.USAGE_NOTIFICATION)
                    .build();
            mChannel.setSound(soundUri, audioAttributes);

            if (mNotificationManager != null) {
                mNotificationManager.createNotificationChannel( mChannel );
            }
    }

    NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this, Utils.CHANNEL_SIREN_ID)
            .setSmallIcon(R.drawable.ic_stat_maps_local_library)
            .setLargeIcon(BitmapFactory.decodeResource(getApplicationContext().getResources(), R.mipmap.ic_launcher))
            .setTicker(title)
            .setContentTitle(contentTitle)
            .setContentText(contentText)
            .setAutoCancel(true)
            .setLights(0xff0000ff, 300, 1000) // blue color
            .setWhen(System.currentTimeMillis())
            .setPriority(NotificationCompat.PRIORITY_DEFAULT);

    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) {
            mBuilder.setSound(soundUri);
    }

    int NOTIFICATION_ID = 1; // Causes to update the same notification over and over again.
    if (mNotificationManager != null) {
        mNotificationManager.notify(NOTIFICATION_ID, mBuilder.build());
    }
8
  1. データをクリアしてみてください(または新規インストール)
  2. これをもう一度試してください

設定は、初めてチャネルを作成するときに設定され、新規インストールまたはデータのクリアによって手動で行わない限り変更されません。

これに関する詳細については、ここで一番上の答えをお読みください: Android Oreo通知は、音を設定しなくても音を出し続けます。古いバージョンでは、完全に動作します

6

通知の処理中にこのメソッドを呼び出すことができます

    public void playNotificationSound() {
    try {
        Uri alarmSound = Uri.parse(ContentResolver.SCHEME_Android_RESOURCE
                + "://" + mContext.getPackageName() + "/raw/notification");
        Ringtone r = RingtoneManager.getRingtone(mContext, alarmSound);
        r.play();
    } catch (Exception e) {
        e.printStackTrace();
    }
}
5
Uma Achanta

サウンドの設定に使用します

Uri defaultSoundUri = Uri.parse(ContentResolver.SCHEME_Android_RESOURCE + "://" + mContext.getPackageName() + "/raw/mysound");


NotificationCompat.Builder mBuilder =
                new NotificationCompat.Builder(mContext)
                        .setContentIntent(mainPIntent)
                        .setSmallIcon(R.mipmap.ic_launcher)
                        .setLargeIcon(BitmapFactory.decodeResource(mContext.getResources(), R.mipmap.ic_launcher))
                        .setContentTitle("" + title)
                        .setAutoCancel(true)
                        .setSound(defaultSoundUri)
                        .setContentText("" + body);

        NotificationManager mNotificationManager =
                (NotificationManager) mContext.getSystemService(Context.NOTIFICATION_SERVICE);
        mNotificationManager.notify(title, NOTIFICATION_ID, mBuilder.build());
1
Ashish Pardhiye

リソースのサブフォルダーのサウンドにアクセスしています

uriのソースを

Uri uri = Uri.parse("Android.resource://" + context.getPackageName() + "/" + R.raw.siren);

デフォルトのサウンドには、次を使用します。

notification.defaults |= Notification.DEFAULT_SOUND;
0
Lucem

よくわかりませんが、問題はあなたが間違ったやり方をしていることだと思います"/raw/mysound.mp3

Uri uri = Uri.parse("Android.resource://" + ctxt.getPackageName() + "/raw/mysound.mp3");

最初にマニフェストに許可を追加します:uses-permission Android:name="Android.permission.VIBRATE" />次に、デフォルトのサウンドを次のように設定できます。

Uri alarmSound = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
mBuilder.setSound(alarmSound);

および振動用:

mBuilder.setVibrate(new long[] { 1000, 1000});

カスタムサウンドの場合、次のパスにmp3ファイルを配置します:Res\raw\sound.mp3 その後

Notification notification = builder.build();
 notification.sound = Uri.parse("Android.resource://"
        + context.getPackageName() + "/" + R.raw.sound);
0
 Notification.Builder builder = new Notification.Builder(context);
    builder.setContentTitle(mTitle);
    builder.setContentText(mContentText);
    builder.setSmallIcon(R.mipmap.ic_launcher);

    builder.setSound(Settings.System.DEFAULT_NOTIFICATION_URI);
    builder.setVibrate(new long[] { 1000, 1000, 1000, 1000, 1000 });
    builder.setDefaults(Notification.DEFAULT_ALL);

これを使用してサウンドを操作してください。問題が解決することを願っています、乾杯!

0
Aleesha Kanwal