当应用程序未运行时,无法在 intentservice 上使用 Picasso 目标获取图像位图

Posted

技术标签:

【中文标题】当应用程序未运行时,无法在 intentservice 上使用 Picasso 目标获取图像位图【英文标题】:can't get bitmap of image using Picasso target on intentservice when app is not running 【发布时间】:2017-12-13 09:02:59 【问题描述】:

此代码用于在警报管理器触发警报时显示大图样式通知,并且大图图像必须使用 picasso 和 intentservice 从互联网下载,即使应用程序未在前台或后台运行但在应用程序在前台运行时工作正常或背景

当应用程序处于前台和后台时,我收到了从互联网下载的图像的通知 检查视频以了解问题请静音音频,因为它非常嘈杂

https://www.youtube.com/watch?v=ID3PLuBvaRE&t=35s

class ShowNotificationFromAlarm : IntentService("ShowNotificationFromAlarm") 

    var target = object : Target 
        override fun onPrepareLoad(placeHolderDrawable: Drawable?) 
            Log.d("alarmnoti", "onprepareload")
        

        override fun onBitmapFailed(errorDrawable: Drawable?) 
            Log.d("alarmnoti", "bitmapfailed")
        

        override fun onBitmapLoaded(bitmap: Bitmap?, from: Picasso.LoadedFrom?) 
            Log.d("alarmnoti", "bitmaploaded")
            val builder = Notification.Builder(this@ShowNotificationFromAlarm)
                    .setSmallIcon(R.drawable.ic_share)
                    .setContentTitle(this@ShowNotificationFromAlarm.getString(R.string.app_name))
                    .setContentText("this is text")
                    .setLargeIcon(bitmap)
                    .setDefaults(Notification.DEFAULT_ALL)
                    .setPriority(Notification.PRIORITY_HIGH) //must give priority to High, Max which will considered as heads-up notification
                    .setStyle(Notification.BigPictureStyle()
                            .setBigContentTitle("this is big content title")
                            .setSummaryText("this is summary text")
                            .bigPicture(bitmap)
                    )

            //.addAction(action)
            val notification = builder.build()
            NotificationManagerCompat.from(this@ShowNotificationFromAlarm).notify(100, notification)
        
    

    override fun onHandleIntent(intent: Intent?)     
        Log.d(this.packageName + "\t intentservice", "intent started")

        if (intent != null) 
            val uiHandler = Handler(Looper.getMainLooper())
            uiHandler.post(Runnable 
                shownotification(this@ShowNotificationFromAlarm.applicationContext, intent)
            )
        
    

    private fun shownotification(context: Context, intent: Intent)     
        val intent = Intent(context, MainActivity::class.java)
        val pIntent = PendingIntent.getActivity(context, System.currentTimeMillis().toInt(), intent, 0)    
        Picasso.with(context)
                .load("https://cartodb-basemaps-d.global.ssl.fastly.net/dark_nolabels/3/3/4.png")
                //.load(context.filesDir.absolutePath + File.pathSeparator+"logo-2.png")
                .into(target)
    

【问题讨论】:

onBitmapLoaded行添加断点并确认bitmap的值 【参考方案1】:

由于您使用的是已经在单独线程上运行的IntentService。您可以直接下载图像而不是将下载任务推送到其他线程。请参阅下面的代码。

public class DownloadClass extends IntentService
public DownloadClass(String name) 
    super(name);


@Override
protected void onHandleIntent(@Nullable Intent intent) 
    String url =intent.getStringExtra("url");
    Bitmap bitmap=downloadImageBitmap(url);
    if(bitmap!=null)
        // Use bitmap here
    


private Bitmap downloadImageBitmap(String sUrl) 
    Bitmap bitmap = null;
    try 
        InputStream inputStream = new URL(sUrl).openStream();   // Download Image from URL
        bitmap = BitmapFactory.decodeStream(inputStream);       // Decode Bitmap
        inputStream.close();
     catch (Exception e) 
        e.printStackTrace();
    
    return bitmap;


【讨论】:

我的错。概念是一样的。你可以试一试。让我知道它是否有效。 是的,非常感谢........ :) 兄弟,谢谢,但我修改了我在 try 块中写通知的一点点,因为图像必须下载,可能需要一些时间 好的。 Thx.阅读有关意图服务以获取更多信息。 当然,我必须获得更多关于意向服务的知识,祝你有美好的一天

以上是关于当应用程序未运行时,无法在 intentservice 上使用 Picasso 目标获取图像位图的主要内容,如果未能解决你的问题,请参考以下文章

应用未运行时无法接收推送通知

iOS 如何在应用未运行时处理 FCM

React app Express Api无法运行localhost 404(未找到)

Laravel 项目在 Ubuntu 16.04 上未运行 php artisan serve 时无法运行

System.err:TypeError:无法读取未定义的属性“onNavigatingTo”

当应用程序未运行时,GCM 推送通知未在某些设备中显示