5

私は次のように通知を作成しています:

        Intent intent = new Intent(this, OfferNotification.class);
        PendingIntent pIntent = PendingIntent.getActivity(this, 0,
                intent, 0);
        Uri soundUri = RingtoneManager
                .getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
        NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(
                this).setSmallIcon(R.drawable.unknown)
                //.setLargeIcon(BitmapFactory.decodeResource( getResources(), R.drawable.unknown))
                .addAction(R.drawable.ic_launcher, "d", pIntent)
                .setAutoCancel(true)
                .setContentTitle("Offer from " + restaurantName)
                .setContentText(offerDescriptoin).setSound(soundUri);
        // Creates an explicit intent for an Activity in your app
        Intent resultIntent = new Intent(this, OfferNotification.class);
        resultIntent.putExtra("offerID", offer.getID());
        TaskStackBuilder stackBuilder = TaskStackBuilder.create(this);

        stackBuilder.addParentStack(OfferNotification.class);

        stackBuilder.addNextIntent(resultIntent);
        PendingIntent resultPendingIntent = stackBuilder
                .getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT);
        mBuilder.setContentIntent(resultPendingIntent);
        NotificationManager mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);

        mNotificationManager.notify(offer.getID(), mBuilder.build());

小さいアイコンを使用したときは非常にうまく機能しますが、大きいアイコンを使用すると、通知の声を髪にすることはできますが、通知自体は表示されません。

4

3 に答える 3

7

Android アイコン (およびドラッグの長さなどの他の UI 要素) は dp で測定されます。dp は、デバイス/密度に依存しないピクセルです。1 dp は、160 dpi の画面では 1 px に相当します。ただし、他の画面密度に変換するには、密度係数を掛ける必要があります。そのため、通常は、ほとんどのアイコンに複数の画像を提供することをお勧めします。

たとえば、ステータス バーで使用される通知アイコンは 24x24 dp として指定され、1 dp の余白があります (したがって、実際のアイコンは 22x22 dp のオプティカル スクエアしか占有しませんが、AA の一部はその 1 dp の余白/セーフフレームににじむ可能性があります)。 )。24 dp を実際のピクセル サイズに変換するには、次の大まかな計算が使用されます。

display density  dp units * scale = px units
ldpi  ~120 dpi   24x24 dp * .75   = 18x18 px
mdpi  ~160 dpi   24x24 dp * 1.0   = 24x24 px
hdpi  ~240 dpi   24x24 dp * 1.5   = 36x36 px
xhdpi ~320 dpi   24x24 dp * 2.0   = 48x48 px

mdpi と hdpi の間にあり、倍率が 1.33 の tvdpi (~213 dpi) と呼ばれる中間の表示密度もありますが、これはあまり一般的ではありません。Android のドキュメントで推奨されているのは、最も一般的な表示密度に対して事前にスケーリングされたビットマップ画像 (通常は PNG) を提供する場合、3:4:6:8 のスケーリング比に従うことです。

通知で使用される大きなアイコンの dp サイズを指定している場所はどこにもありませんが、通常の受信トレイ ビューでの各通知の高さは 64 dp です。つまり、そこに表示されるアイコン/画像の最大サイズは次のようになります。

ldpi:     48x48 px
mdpi:     64x64 px
hdpi:     96x96 px
xhdpi:  128x128 px

Android のストック アイコンの画像サイズを正確に知りたい場合は、Android Icon Templates Pack、v4.0 から確認できるはずです。

于 2013-06-08T08:10:33.433 に答える
3

SetSmallIcon と SetLargeIcon の呼び出しを誤って解釈したという同じ問題がありました。小さいアイコンを指定する必要があります。そうしないと、通知は表示されません。大きいアイコンはオプションで、設定されていない場合は小さいアイコンが使用されます。

于 2015-07-16T09:11:35.717 に答える
1

次のように、ビルダーでビットマップを要求する前に、ビットマップをデコードする必要があると思います。

 Bitmap bitmap = BitmapFactory.decodeResource( getResources(), R.drawable.unknown);
 Intent intent = new Intent(this, OfferNotification.class);
        PendingIntent pIntent = PendingIntent.getActivity(this, 0,
                intent, 0);
        Uri soundUri = RingtoneManager
                .getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
        NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(
                this).setSmallIcon(R.drawable.unknown)
                //.setLargeIcon(bitmap)
                .addAction(R.drawable.ic_launcher, "d", pIntent)
                .setAutoCancel(true)
                .setContentTitle("Offer from " + restaurantName)
                .setContentText(offerDescriptoin).setSound(soundUri);

正しくデコードされていないか、時間内にデコードされていない可能性があります。また、ここで未知の 1 つを排除します。

于 2013-06-08T07:39:15.247 に答える