Android – используйте внешний профиль в панели уведомлений, например Facebook

Я знаю, что вы можете отправлять информацию в параметры push-уведомления, такие как сообщение, название, URL-адрес изображения и т. Д. Как Facebook показывает ваш профиль pic с вашим сообщением в области уведомлений? Я хочу использовать внешнее изображение в области уведомлений, поэтому, когда вы его вытаскиваете, вы видите изображение профиля с сообщением. Прямо сейчас у меня только что отображается значок по умолчанию из выпадающей папки. Я подумал, что это может быть общим вопросом, но ничего не найти. Любая помощь будет приятной.

Этот оператор будет использовать метод преобразования URL (естественно, тот, который указывает на изображение) в Bitmap .

 Bitmap bitmap = getBitmapFromURL("https://graph.facebook.com/YOUR_USER_ID/picture?type=large"); 

Примечание. Поскольку вы упоминаете профиль Facebook, я включил URL-адрес, который получает ваше изображение профиля большого размера пользователя Facebook. Однако вы можете изменить это на любой URL-адрес, который указывает на изображение, которое необходимо отобразить в Notification .

И метод, который получит изображение из 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 и его конфигурации. Поэтому я пропущу эту часть и добавлю только создателя .

 // 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; } в 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()); 

I, что вы k'no о разрешении Android:

 <uses-permission android:name="android.permission.INTERNET" /> 

Для более подробной проверки этого артиста и разработчика Android

Для этого я использовал Universal 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); 
 Notification notif = new Notification.Builder(context) .setContentTitle("Title") .setContentText("content") .setSmallIcon(R.drawable.ic_small) .setLargeIcon(bitmap) .setStyle(new Notification.BigPictureStyle() .bigPicture(bigBitmap) .setBigContentTitle("big title")) .build();