Загрузите изображение с Пикассо в классе обслуживания - PullRequest
0 голосов
/ 02 апреля 2020

Я поражен точкой в ​​моем android приложении. Я разрабатываю приложение, в котором я использую класс обслуживания и получаю уведомление через мой класс обслуживания. Теперь есть сценарий, в котором я хочу изменить обои моего приложения моего телефона, и я успешно делаю это в своем коде, но то же самое, когда я помещаю в класс обслуживания, приложение вылетает и выдает ошибку, Пикассо должен запускаться в главном потоке. На самом деле в моем приложении есть сценарий, если я получаю уведомление, даже если мое приложение находится в фоновом режиме, тогда обои должны быть изменены. Вот мой код:

public class FirebaseMessagingServices extends FirebaseMessagingService {
    @Override
    public void onMessageReceived(RemoteMessage remoteMessage) {
      RemoteMessage.Notification notification = remoteMessage.getNotification();

        if (data.isEmpty()) {
            System.out.println("FCM type is Notification");
            parseNotificationMessage(notification);

        }
        else {
            System.out.println("FCM type is Data");
            parseDataMessage(remoteMessage);
        }

    }

Здесь я изменяю получение сообщения и при получении проверяю сообщение и генерирую уведомление

    private void parseDataMessage(RemoteMessage remoteMessage) {
        String notification_title =remoteMessage.getData().get("title");

        String notification_message = remoteMessage.getData().get("message");

        if(notification_title.contains("wallpaper"))
        {
            changeWallpaper(notification_message);
        }
  else
        {
            generateNotification(remoteMessage.getData().get("title"), 
            remoteMessage.getData().get("message"));
        }

}

 public void changeWallpaper(String url)
    {
              final WallpaperManager myWallpaperManager
                = WallpaperManager.getInstance(activity);
        Picasso.with(activity).load(url).into(new Target() {
            @Override
            public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) {
                Log.i("ok", "The image was obtained correctly");
                try {
                    myWallpaperManager.setBitmap(bitmap);
                    Toast.makeText(activity, "Image has been set as Desktop Wallpaper", Toast.LENGTH_SHORT).show();
                 //   ((Activity) activity).findViewById(R.id.progressbar_wallpaper).setVisibility(View.GONE);
                } catch (IOException e) {
                    e.printStackTrace();
                }

            }

            @Override
            public void onBitmapFailed(Drawable errorDrawable) {
                Log.e("ok", "The image was not obtained");
            }

            @Override
            public void onPrepareLoad(Drawable placeHolderDrawable) {
                Log.e("ok", "Getting ready to get the image");
                //Here you should place a loading gif in the ImageView
                //while image is being obtained.
            }
        });

    }

Это успешно меняет обои в главном потоке но я хочу изменить обои в классе обслуживания, даже если приложение находится в фоновом режиме. Буду признателен за любую помощь

1 Ответ

0 голосов
/ 02 апреля 2020

Я решил эту проблему, используя библиотеку glideray вместо Пикассо, и она работает плавно, даже когда приложение находится в фоновом режиме

final WallpaperManager myWallpaperManager
                = WallpaperManager.getInstance(this);

        Glide.with(getApplicationContext())
                .asBitmap()
                .load(url)
                .into(new SimpleTarget<Bitmap>() {
                    @Override
                    public void onResourceReady(Bitmap resource, Transition<? super Bitmap> transition) {
                        try {
                            myWallpaperManager.setBitmap(resource);
                        } catch (IOException e) {
                            e.printStackTrace();
                        }

                    }

                });
...