メッセージ、タイトル、画像URLなどのプッシュ通知パラメータで情報を送信できることを知っています。通知領域のメッセージでFacebookがプロフィール写真をどのように表示しますか?通知領域で外部画像を使用したいので、プルダウンすると、メッセージとともにプロフィール画像が表示されます。今のところ、私はドローアブルフォルダのデフォルトのアイコンを表示しています。これはよくある質問であると考えましたが、何も見つかりませんでした。どんな助けでもいいです。
このステートメントは、メソッドを使用して、URL(当然、画像を指すもの)をBitmap
に変換します。
_Bitmap bitmap = getBitmapFromURL("https://graph.facebook.com/YOUR_USER_ID/picture?type=large");
_
注: Facebookプロフィールについて言及したので、Facebookユーザーの大きなサイズのプロフィール写真を取得するためのURLを含めました。ただし、これをNotification
に表示する必要がある画像を指す任意のURLに変更できます。
上記のステートメントで指定したURLから画像を取得するメソッド:
_public Bitmap getBitmapFromURL(String strURL) {
try {
URL url = new URL(strURL);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setDoInput(true);
connection.connect();
InputStream input = connection.getInputStream();
Bitmap myBitmap = BitmapFactory.decodeStream(input);
return myBitmap;
} catch (IOException e) {
e.printStackTrace();
return null;
}
}
_
次に、上記で作成したbitmap
インスタンスを_Notification.Builder
_インスタンスに渡します。このコード例ではbuilder
と呼んでいます。この行で使用されます:builder.setLargeIcon(bitmap);
。私はあなたが実際のNotification
とその設定を表示する方法を知っていると想定しています。したがって、その部分をスキップして、builderだけを追加します。
_// CONSTRUCT THE NOTIFICATION DETAILS
builder.setAutoCancel(true);
builder.setSmallIcon(R.drawable.ic_launcher);
builder.setContentTitle("Some Title");
builder.setContentText("Some Content Text");
builder.setLargeIcon(bitmap);
builder.setContentIntent(pendingIntent);
_
ああ、ほとんど忘れてしまいました。まだ行っていない場合は、マニフェストでこの権限を設定する必要があります。
_<uses-permission Android:name="Android.permission.INTERNET" />
_
private Bitmap getBitmap(String url)
{
File f=fileCache.getFile(url);
//from SD cache
Bitmap b = decodeFile(f);
if(b!=null)
return b;
//from web
try {
Bitmap bitmap=null;
URL imageUrl = new URL(url);
HttpURLConnection conn = (HttpURLConnection)imageUrl.openConnection();
conn.setConnectTimeout(30000);
conn.setReadTimeout(30000);
conn.setInstanceFollowRedirects(true);
InputStream is=conn.getInputStream();
OutputStream os = new FileOutputStream(f);
Utils.CopyStream(is, os);
os.close();
bitmap = decodeFile(f);
return bitmap;
} catch (Exception ex){
ex.printStackTrace();
return null;
}
}
//decodes image and scales it to reduce memory consumption
private Bitmap decodeFile(File f){
try {
//decode image size
BitmapFactory.Options o = new BitmapFactory.Options();
o.inJustDecodeBounds = true;
BitmapFactory.decodeStream(new FileInputStream(f),null,o);
//Find the correct scale value. It should be the power of 2.
final int REQUIRED_SIZE=70;
int width_tmp=o.outWidth, height_tmp=o.outHeight;
int scale=1;
while(true){
if(width_tmp/2<REQUIRED_SIZE || height_tmp/2<REQUIRED_SIZE)
break;
width_tmp/=2;
height_tmp/=2;
scale*=2;
}
//decode with inSampleSize
BitmapFactory.Options o2 = new BitmapFactory.Options();
o2.inSampleSize=scale;
return BitmapFactory.decodeStream(new FileInputStream(f), null, o2);
} catch (FileNotFoundException e) {}
return null;
}
Bitmap icon1 = downloadedBitmap;
NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(
this).setAutoCancel(true)
.setContentTitle("DJ-Android notification")
.setSmallIcon(R.drawable.ic_launcher)
.setContentText("Hello World!");
NotificationCompat.BigPictureStyle bigPicStyle = new NotificationCompat.BigPictureStyle();
bigPicStyle.bigPicture(icon1);
bigPicStyle.setBigContentTitle("Dhaval Sodha Parmar");
mBuilder.setStyle(bigPicStyle);
// Creates an explicit intent for an Activity in your app
Intent resultIntent = new Intent(this, testActivity.class);
// The stack builder object will contain an artificial back stack
// for
// the
// started Activity.
// This ensures that navigating backward from the Activity leads out
// of
// your application to the Home screen.
TaskStackBuilder stackBuilder = TaskStackBuilder.create(this);
// Adds the back stack for the Intent (but not the Intent itself)
stackBuilder.addParentStack(testActivity.class);
// Adds the Intent that starts the Activity to the top of the stack
stackBuilder.addNextIntent(resultIntent);
PendingIntent resultPendingIntent = stackBuilder.getPendingIntent(
0, PendingIntent.FLAG_UPDATE_CURRENT);
mBuilder.setContentIntent(resultPendingIntent);
NotificationManager mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
// mId allows you to update the notification later on.
mNotificationManager.notify(100, mBuilder.build());
<uses-permission Android:name="Android.permission.INTERNET" />
詳細については、これを確認してください artical および Android developer
画像はインターネットから読み込まれるため、バックグラウンドスレッドでasyncを実行する必要があります。(1)非同期タスクまたは(2)Glide(効率的な画像読み込み用)を使用できます。
画像通知をロードするには、「NotificationCompat.BigPictureStyle()」を使用する必要があります。 bitmapが必要です(画像のURLから抽出する必要があります)
ほとんどのAPIとGlideのメソッドは非推奨になりました。以下は、Glide 4.9以降Android 10。
ステップ1:バックグラウンドスレッドの画像URLからビットマップを読み込む
private void getBitmapAsyncAndDoWork(String imageUrl) {
final Bitmap[] bitmap = {null};
Glide.with(getApplicationContext())
.asBitmap()
.load(imageUrl)
.into(new CustomTarget<Bitmap>() {
@Override
public void onResourceReady(@NonNull Bitmap resource, @Nullable Transition<? super Bitmap> transition) {
bitmap[0] = resource;
// TODO Do some work: Load image notification from here
displayImageNotification(bitmap[0]);
}
@Override
public void onLoadCleared(@Nullable Drawable placeholder) {
}
});
}
ステップ2:イメージ通知を1回表示し、ビットマップの準備が整います。
private void displayImageNotification(Bitmap bitmap) {
NotificationCompat.Builder builder = new NotificationCompat.Builder(getApplicationContext(), getChannelId());
builder
.setContentTitle(title)
.setContentText(subtext)
.setDefaults(Notification.DEFAULT_LIGHTS | Notification.DEFAULT_VIBRATE)
.setSmallIcon(SMALL_ICON)
.setPriority(NotificationCompat.PRIORITY_DEFAULT)
.setColor(getApplicationContext().getColor(color))
.setAutoCancel(true)
.setOngoing(false)
.setOnlyAlertOnce(true)
.setContentIntent(pendingIntent)
.setStyle(
new NotificationCompat.BigPictureStyle().bigPicture(bitmap))
.setPriority(Notification.PRIORITY_HIGH);
getManager().notify(tag, id, builder.build());
}
これを解決するために niversal Image Loader を使用しました。設定方法については、wikiをご覧ください。一度インスタンス化した後、これは私のGCMリスナーでイメージをダウンロードして表示するために使用するコードです。ビットマップをダウンロードして、通知に設定します。
// Download profile picture of the user with Universal Image Loader
Bitmap bitmap = ImageLoader.getInstance().loadImageSync(profilePhotoUrl);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0 /* Request code */, intent,
PendingIntent.FLAG_ONE_SHOT);
Uri defaultSoundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this)
.setSmallIcon(R.drawable.ic_my_app)
.setLargeIcon(bitmap) // This is the image displayed on the lock screen
.setContentTitle("My App")
.setContentText(message)
.setAutoCancel(true)
.setSound(defaultSoundUri)
.setContentIntent(pendingIntent);