Передача изображения из деятельности в класс android (живые обои) - PullRequest
2 голосов
/ 23 апреля 2020

Я работаю над тем, как применить живые обои (GIF изображение). Когда я нажимаю кнопку «Применить», изображение по умолчанию устанавливается в качестве обоев. Я получаю все изображения из FireBase. Поэтому я хочу установить это изображение в качестве обоев. Я не знаю, как передать это gif-изображение с LiveViewActivity на GIFWallpaperService, чтобы установить это .gif-изображение в качестве живых обоев вместо изображения по умолчанию. (извините за мой плохой Engli sh, надеюсь, вы понимаете)

LiveWallpaperActivity.java //main activity(where I'm getting all the images from firebase)

         |
         |  //pass the .gif image url by intent to next activity
         |

  LiveViewActivity.java

             |
             |
             | //Here I receive the image by intent and load into imageview with glide
             |
             | //added a button to apply live wallpaper(.gif image)
             | //pass .gif image to GIFWallpaperService class service (I don't know how to do)
             |
    GIFWallpaperService

LiveViewActivity

Где я добавляю кнопку для применения живых обоев

здесь я хочу передать изображение .gif в GIFWallpaperService

public class LiveViewActivity extends AppCompatActivity {

    ImageView imageView;
    Button setLiveWallpaper;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_live_view);

        imageView = findViewById(R.id.viewImage);
        Glide.with(this).load(getIntent().getStringExtra("images")).into(imageView);

        setLiveWallpaper.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                applyLiveWallpaper();
            }
        });

    }

    private void applyLiveWallpaper() {
        Intent intent = new Intent(
                WallpaperManager.ACTION_CHANGE_LIVE_WALLPAPER);
        intent.putExtra(WallpaperManager.EXTRA_LIVE_WALLPAPER_COMPONENT,
                new ComponentName(this, GIFWallpaperService.class));
        startActivity(intent);
    }

}

GIFWallpaperService

здесь я хочу получить изображение .gif, которое я отправляю из LiveViewActivity для установки в качестве живых обоев


public class GIFWallpaperService extends WallpaperService {

    @Override
    public WallpaperService.Engine onCreateEngine() {

        try {

            Movie movie = Movie.decodeStream(getResources().getAssets().open("sea_gif.gif")); //Here is the default gif image

            return new GIFWallpaperEngine(movie);

        } catch (IOException e) {
            Log.d("GIFWallpaperService", "Could not loaded live wallpaper");
            return null;
        }

    }

    private class GIFWallpaperEngine extends WallpaperService.Engine {

        private final int frameDuration = 20;
        private SurfaceHolder holder;
        private Movie movie;
        private boolean visible;
        private Handler handler;

        public GIFWallpaperEngine(Movie movie) {

            this.movie = movie;
            handler = new Handler();

        }

        @Override
        public void onCreate(SurfaceHolder surfaceHolder) {
            super.onCreate(surfaceHolder);

            this.holder = surfaceHolder;

        }

        private Runnable drawGIF = new Runnable() {
            @Override
            public void run() {
                draw();
            }
        };

        private void draw() {

            if (visible) {
                Canvas canvas = holder.lockCanvas();
                canvas.save();
                canvas.scale(4f, 4f);

                movie.draw(canvas, -100, 0);

                canvas.restore();

                holder.unlockCanvasAndPost(canvas);
                movie.setTime((int) (System.currentTimeMillis() % movie.duration()));

                handler.removeCallbacks(drawGIF);
                handler.postDelayed(drawGIF, frameDuration);

            }

        }

        @Override
        public void onVisibilityChanged(boolean visible) {
            //super.onVisibilityChanged(visible);

            this.visible = visible;

            if (visible) {
                handler.post(drawGIF);
            } else {
                handler.removeCallbacks(drawGIF);
            }


        }

        @Override
        public void onDestroy() {
            super.onDestroy();
            handler.removeCallbacks(drawGIF);

        }
    }

}


Я не знаю, как отправлять и получать изображения .gif от LiveViewActivity до GIFWallpaperService

Ответы [ 2 ]

1 голос
/ 23 апреля 2020

Ваш вопрос для меня немного туманный, но если я вас правильно понял, на самом деле вы можете легко получить изображение в LiveWallpaperActivity через адаптер по контексту, а затем из этого упражнения вы можете передать свое изображение в любое действие, которое захотите, с помощью намерение.

Чтобы отправить данные из действия в службу, вам необходимо переопределить onStartCommand, там у вас есть прямой доступ к намерению:

Override
public int onStartCommand(Intent intent, int flags, int startId) {

, затем из LiveViewActivity вы создадите объект намерения чтобы запустить службу, а затем вы помещаете имя вашего изображения в объект намерения:

 Intent serviceIntent = new Intent(YourService.class.getName())
 serviceIntent.putExtra("IMAGE_KEY", "image");
 context.startService(serviceIntent);

Когда служба запускается, вызывается ее метод onStartCommand (), тогда вы можете получить изображение:

public int onStartCommand (Intent intent, int flags, int startId) {
String image = intent.getStringExtra("IMAGE_KEY");
return START_STICKY;
}
0 голосов
/ 23 апреля 2020

Попробуйте использовать DomainEventBus, который помогает передавать объекты, изображения и фактически любые типы данных во все приложения. https://greenrobot.org/eventbus/

При этом вам необходимо зарегистрировать «шину событий» при создании службы, и она сможет получать изображение из любого компонента приложения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...