首页 > 解决方案 > 即使应用程序关闭,我也想在屏幕上显示 gif 图像

问题描述

通过鼠标单击,您实现了两件事:

即使关闭正在使用服务的应用程序,我也试图在屏幕上显示 GIF,但由于在出现 GIF 图像时声音一直在播放,我找不到解决方案。

TheService.java (代码)

package gallery.suitapps.catwalking;

import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.media.MediaPlayer;
import android.media.SoundPool;
import android.os.Build;
import android.os.IBinder;
import android.provider.Settings;
import android.support.annotation.Nullable;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.ImageView;
import android.widget.Toast;

import pl.droidsonroids.gif.GifImageView;

public class TheService extends Service  {

    final class MyThreadClass implements Runnable{
        int service_id;
        MyThreadClass(int service_id){
            this.service_id=service_id;
        }

        @Override
        public void run() {

        }
    }

    SoundPool soundPool = null;
    private int[] f10685s;


    MainActivity main = new MainActivity();

    public MediaPlayer player;
    Context context;

    @Override
    public void onCreate() {
        super.onCreate();
    }

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

        Toast.makeText(this,"Service Starts" , Toast.LENGTH_SHORT).show();
        player = MediaPlayer.create(this,R.raw.sound2);
        player.setLooping(true);
        player.start();

        MainActivity.imageView.setImageResource(R.drawable.cat_gif);

        return START_STICKY;

    }

    @Override
    public void onDestroy() {
        Toast.makeText(this,"Service Stops" , Toast.LENGTH_SHORT).show();
        player.stop();
        MainActivity.imageView.setImageResource(R.drawable.ic_launcher_background);
    }

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

}

MainActivity.java (代码)

package gallery.suitapps.catwalking;

import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.ImageView;

import pl.droidsonroids.gif.GifImageView;

public class MainActivity extends AppCompatActivity {

    public static GifImageView imageView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        imageView = findViewById(R.id.catgif);
    }

    public void startService (View view){

        Intent intent = new Intent(this,TheService.class);
        startService(intent);

       // imageView.setImageResource(R.drawable.cat_gif);

    }

    public void stopService (View view){

        Intent intent = new Intent(this,TheService.class);
        stopService(intent);

    }


}

activity_main.xml

 <?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <Button
        android:id="@+id/startService"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginBottom="8dp"
        android:layout_marginEnd="8dp"
        android:layout_marginLeft="8dp"
        android:layout_marginRight="8dp"
        android:layout_marginStart="8dp"
        android:layout_marginTop="8dp"
        android:text="Start Service"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.501"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintVertical_bias="0.134"
        android:onClick="startService"/>

    <Button
        android:id="@+id/stopService"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginBottom="8dp"
        android:layout_marginEnd="8dp"
        android:layout_marginLeft="8dp"
        android:layout_marginRight="8dp"
        android:layout_marginStart="8dp"
        android:layout_marginTop="8dp"
        android:text="Stop Service"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.502"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintVertical_bias="0.362"
        android:onClick="stopService"/>

    <pl.droidsonroids.gif.GifImageView
        android:id="@+id/catgif"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:src="@drawable/ic_launcher_background"
        android:background="@android:color/holo_blue_dark"
        />

</android.support.constraint.ConstraintLayout>

标签: androidserviceandroid-servicejava-threadsandroid-thread

解决方案


According to your requirement you need to implement system window alert in service class to show image in background when the app is closed

This is the solution for your requirement.

In manifest add this

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

Then in your launcher activity or any base activity add these permissions

 private static final int CODE_DRAW_OVER_OTHER_APP_PERMISSION = 2084;

In onCreate() add this

if (SDK_INT >= Build.VERSION_CODES.M && !Settings.canDrawOverlays(this)) {
            Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION, Uri.parse("package:" + getPackageName()));
            startActivityForResult(intent, CODE_DRAW_OVER_OTHER_APP_PERMISSION);
            //finish();
        }

Handle the request permission

@Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (requestCode == CODE_DRAW_OVER_OTHER_APP_PERMISSION) {
            if (SDK_INT >= Build.VERSION_CODES.M && !Settings.canDrawOverlays(this)) {
                Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION, Uri.parse("package:" + getPackageName()));
                startActivityForResult(intent, CODE_DRAW_OVER_OTHER_APP_PERMISSION);
            } else {
               // do stuff here 
            }
        }
    }

and do this in service class check the link below and do your stuff respectively

   https://medium.com/@kevalpatel2106/create-chat-heads-like-facebook-messenger-32f7f1a62064

where image_layout. xml is

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <pl.droidsonroids.gif.GifImageView
        android:id="@+id/catgif"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:src="@drawable/ic_launcher_background"
        android:background="@android:color/holo_blue_dark"
        />

</android.support.constraint.ConstraintLayout>

Update:- You can make changed in image_layout file to show your GIF any size and gravity in the screen You can make changes with

android:layout_width="any_size"
    android:layout_height="any_size"

推荐阅读