我遇到了正确创建和发送通知的问题。我在此处阅读了新的SUM()
通知设计规范:https://material.google.com/style/icons.html和https://material.google.com/patterns/notifications.html,我意识到图标需要Lollipop 5.0 update
才能正确显示。这很好,我完全明白,但我希望我的通知显示一张图片,显然不能是白色的。然而,令我感到困惑的是,当我尝试在手机上呈现通知时,一切正常。它看起来像这样:
然而,在我朋友的手机上,它看起来像一个白色方块,如下所示:
这很奇怪,因为我们都拥有相同版本的Android,版本6.0.1。以下是我用来发送通知的代码:
white
build.gradle配置:
private class NotificationPicture extends AsyncTask<String, Void, Bitmap> {
Context context;
String userId;
String postId;
String name;
String notificationBody;
String from;
public NotificationPicture(Context context) {
super();
this.context = context;
}
@Override
protected Bitmap doInBackground(String... params) {
userId = params[0];
postId = params[1];
name = params[2];
notificationBody = params[3];
from = params[4];
try {
URL url = new URL("https://graph.facebook.com/" + userId + "/picture?type=large");
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setDoInput(true);
connection.connect();
InputStream in = connection.getInputStream();
Bitmap bitmap = BitmapFactory.decodeStream(in);
Bitmap output;
Rect srcRect;
if (bitmap.getWidth() > bitmap.getHeight()) {
output = Bitmap.createBitmap(bitmap.getHeight(), bitmap.getHeight(), Bitmap.Config.ARGB_8888);
srcRect = new Rect((bitmap.getWidth()-bitmap.getHeight())/2, 0, bitmap.getWidth()+(bitmap.getWidth()-bitmap.getHeight())/2, bitmap.getHeight());
} else {
output = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getWidth(), Bitmap.Config.ARGB_8888);
srcRect = new Rect(0, (bitmap.getHeight()-bitmap.getWidth())/2, bitmap.getWidth(), bitmap.getHeight()+(bitmap.getHeight()-bitmap.getWidth())/2);
}
Canvas canvas = new Canvas(output);
final int color = 0xff424242;
final Paint paint = new Paint();
final Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight());
float r;
if (bitmap.getWidth() > bitmap.getHeight()) {
r = bitmap.getHeight() / 2;
} else {
r = bitmap.getWidth() / 2;
}
paint.setAntiAlias(true);
canvas.drawARGB(0, 0, 0, 0);
paint.setColor(color);
canvas.drawCircle(r, r, r, paint);
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
canvas.drawBitmap(bitmap, srcRect, rect, paint);
return output;
} catch (IOException e) {
FirebaseCrash.report(e);
return null;
}
}
@Override
protected void onPostExecute(Bitmap result) {
super.onPostExecute(result);
try {
NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(context)
.setContentTitle(getString(R.string.app_name))
.setContentText(notificationBody)
.setTicker(from + " has responded!")
.setAutoCancel(true)
.setSound(RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION))
.setStyle(new NotificationCompat.BigTextStyle().bigText(notificationBody))
.setSmallIcon(R.drawable.ic_tabs_notification_2)
.setLargeIcon(result);
Intent resultIntent = new Intent(context, CommentsActivity.class);
setupPostDetails(notificationBuilder, resultIntent, postId, userId, name, context);
} catch (Exception e) {
e.printStackTrace();
}
}
}
如果有人知道为什么会发生这种情况,我们将非常感谢您的一些见解。我有三星SM-G900V(三星S5),我的朋友有一个One plus One手机,如果有帮助的话。
答案 0 :(得分:2)
我认为您需要提供带有透明背景的新通知图标,适用于Android 6&amp;大写,所以当您在通知上设置图标时,这样:
.setSmallIcon(android.os.Build.VERSION.SDK_INT > Build.VERSION_CODES.LOLLIPOP ? R.drawable.ic_notif_with_transparent_bg : R.drawable.ic_notif_current)
如果您想要显示照片,也许您可以尝试使用RemoteViews
答案 1 :(得分:0)
希望它能帮到你:
int icon = Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP ? R.drawable.your_logo_for_Kitkat : R.mipmap.your_logo_for_Lolipop_and_uper_version;
NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this)
.setSmallIcon(icon)
.setContentTitle(remoteMessage.getData().get("title"))
.setContentText(remoteMessage.getData().get("shortDescription"))
.setAutoCancel(true)
.setSound(defaultSoundUri)
.setColor(Color.RED)
.setStyle(notiStyle)
.setContentIntent(pendingIntent);
对于网址加载:
private class sendNotification extends AsyncTask<String, Void, Bitmap> {
Context ctx;
String message;
public sendNotification(Context context) {
super();
this.ctx = context;
}
@Override
protected Bitmap doInBackground(String... params) {
InputStream in;
message = params[0] + params[1];
try {
URL url = new URL(params[2]);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setDoInput(true);
connection.connect();
in = connection.getInputStream();
Bitmap myBitmap = BitmapFactory.decodeStream(in);
return myBitmap;
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(Bitmap result) {
super.onPostExecute(result);
try {
NotificationManager notificationManager = (NotificationManager) ctx
.getSystemService(Context.NOTIFICATION_SERVICE);
Intent intent = new Intent(ctx, NotificationsActivity.class);
intent.putExtra("isFromBadge", false);
Notification notification = new Notification.Builder(ctx)
.setContentTitle(
ctx.getResources().getString(R.string.app_name))
.setContentText(message)
.setSmallIcon(R.drawable.ic_launcher)
.setLargeIcon(result).build();
// hide the notification after its selected
notification.flags |= Notification.FLAG_AUTO_CANCEL;
notificationManager.notify(1, notification);
} catch (Exception e) {
e.printStackTrace();
}
}
}