2016-02-17 58 views
2

我需要在Android中显示本地通知。但通知构建器对象应该需要任何图标才能在状态栏中显示它。它具有一定的强制功能,如setSmallIcon(int)。它采用R.java文件的整数参数。但是我不需要使用R.java文件就可以提供直接图像URL。 代码:没有R.java的Android通知

NotificationCompat.Builder builder = new Builder(getContext());   
      Notification notification = builder.setSmallIcon(R.drawable.ic_launcher) 
        .setContentTitle(title) 
        .setContentText(text) 
        .build(); 

没有R.drawable.ic_launcher。我怎样才能做到这一点?

+0

按照通知小图标的新的行为是强制性的。如果你想在你的通知中显示来自网络的图像,你可以使用BIGPicture来设置你的通知,在那里你可以在你的通知的下方显示图像。像flipkart在他的通知中显示 –

+0

查看setSmallIcon的源代码,我只能看到setSmallIcon(int图标)和setSmallIcon(int图标,int级别) - 所以你必须指定一个资源。你可能可以在运行时动态地做到这一点,但我认为这将是hacky。 – Ewald

+0

感谢您的回复。如果我删除函数setSmallIcon()我的应用程序崩溃。但是R.drawable.ic_launcher是R.java文件的一部分。我不需要访问R.java可绘制的整数值。我需要为setSmallIcon(或)设置图像路径而不使用setSmallIcon函数如何设置通知图像 –

回答

1

首先, ,你应该下载你的图片: https://github.com/koush/ion

然后:

Icon ic = Icon.createWithContentUri("uri of your downloaded image"); 
builder.setSmallIcon(ic); 
+0

我无法为setSmallIcon设置图标值。因为它的参数是整数 –

+0

哦,对不起,我的示例只适用于API> = 23 –

1

请参阅下面的代码

private void sendNotification(Bundle extras) { 
    Intent myIntent = null; 
    Bundle bundle = extras; 
    Set<String> set = bundle.keySet(); 
    for (String s : set) { 
     Log.d("bundle", s); 
    } 
    String title = bundle.getString("title"); 
    String message = bundle.getString("detail_text"); 
    String imageUrl = bundle.getString("image"); 
    String url = bundle.getString("url"); 
    Log.d("url", title + " : " + imageUrl + " : " + url + " : " + bundle.getString("from") + " : " + bundle.getString("type")); 
    mNotificationManager = (NotificationManager) 
      this.getSystemService(Context.NOTIFICATION_SERVICE); 
    Intent notificationIntent; 
    if (url != null) { 
     notificationIntent = new Intent(this, SplashScreenActivity.class); 
     notificationIntent.putExtra("url", url); 
     notificationIntent.putExtra("title", title); 
     notificationIntent.setAction("FROM_NOTIFICATION"); 
    } else { 
     notificationIntent = new Intent(this, SplashScreenActivity.class); 
     notificationIntent.setAction("FROM_NONE_NOTIFICATION"); 
    } 
    LogUtils.logD(title + " : " + url); 
    notificationIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP); 
    PendingIntent contentIntent = PendingIntent.getActivity(this, 0, 
      notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT); 
    NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this); 
    mBuilder.setSmallIcon(R.drawable.small_notification); 
    mBuilder.setLargeIcon(BitmapFactory.decodeResource(getBitmapFromURL("YOUR URL")); 

    /* if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) { 
    // mBuilder.setColor(this.getColor(R.color.black)); 
    }*/ 
    final int version = Build.VERSION.SDK_INT; 
    if (version >= 23) { 
     mBuilder.setColor(ContextCompat.getColor(this, R.color.black)); 
    } else { 
     mBuilder.setColor(this.getResources().getColor(R.color.black)); 
    } 
    mBuilder.setTicker("your title"); 
    Uri uri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION); 
    mBuilder.setSound(uri); 
    mBuilder.setPriority(Notification.PRIORITY_MAX); 
    // mBuilder.setV 
    mBuilder.setContentTitle(title); 
    mBuilder.setContentText(message); 
    NotificationCompat.BigPictureStyle s = new NotificationCompat.BigPictureStyle(); 
    if (imageUrl != null) { 
     s.bigPicture(getBitmapFromURL(imageUrl)); 
     s.setSummaryText(message); 
     mBuilder.setStyle(s); 
    } else { 
     mBuilder.setContentText(message); 
    } 
    mBuilder.setAutoCancel(true); 
    mBuilder.setContentIntent(contentIntent); 
    mNotificationManager.notify(NOTIFICATION_ID, mBuilder.build()); 

} 


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; 
    } 
} 

小图标是强制性我尝试删除该图标,但我的应用程序崩溃** ** 参考线

mBuilder.setLargeIcon(BitmapFactory.decodeResource(getBitmapFromURL("YOUR URL"));