(二)android 桌面悬浮窗 录屏源码放送

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zhuxingchong/article/details/86605589

1.录屏控制类接口封装RecordScreenController.java

package com.android.systemui.statusbar.policy;

import com.android.systemui.Dumpable;
import com.android.systemui.statusbar.policy.RecordScreenController.RecordScreenListener;

public interface RecordScreenController extends CallbackController<RecordScreenListener> {

    void setRecordScreen(boolean newState);
    boolean isEnabled();
    void setRecordScreenController(boolean enabled);
    boolean getRecordScreenController();
    void addCallback(RecordScreenListener callback);
    void removeCallback(RecordScreenListener callback);
    boolean isAvailable();


    public interface RecordScreenListener {

        /**
         * Called when the flashlight was turned off or on.
         * @param enabled true if the flashlight is currently turned on.
         */
        void onRecordScreenChanged(boolean enabled);

2.录屏控制了具体控制实现RecordScreenControllerImpl.java

package com.android.systemui.statusbar.policy;

import android.content.Context;
import android.os.UserHandle;
import android.content.Intent;
import com.android.internal.view.RotationPolicy;

import java.util.concurrent.CopyOnWriteArrayList;
import com.android.systemui.statusbar.policy.RecordScreenController;
import com.android.systemui.statusbar.policy.RecordScreenController.RecordScreenListener;
import android.util.Log;
import com.android.systemui.util.ScreenUtil;
import android.app.Application;
import com.android.systemui.ScreenRecordActivity;

/** Platform implementation of the rotation lock controller. **/
public final class RecordScreenControllerImpl implements RecordScreenController {
    private final String TAG = "RecordScreenControllerImpl";
    private int REQUEST_CODE = 1;
    private final Context mContext;
    private final CopyOnWriteArrayList<RecordScreenListener> mListeners = new CopyOnWriteArrayList<RecordScreenListener>();
    private boolean mRecordScreenEnabled;
    private boolean mTorchAvailable = true;
    private boolean mRecordScreenControllerEnabled;

    public RecordScreenControllerImpl(Context context) {
        mContext = context;
    }

    public boolean getRecordScreenController(){
        return mRecordScreenControllerEnabled;
    }

    public void setRecordScreenController(boolean enabled) {
        synchronized (this) {
            mRecordScreenControllerEnabled = enabled;
            dispatchModeChanged();
        }
    }

    public void dispatchModeChanged(){
        Log.d(TAG,"dispatchModeChanged ScreenRecordActivity.instance = "+ScreenRecordActivity.instance+" ScreenUtil.isRecordScreen() = "+ScreenUtil.isRecordScreen());
        if(ScreenRecordActivity.instance == null){
            Intent intent = new Intent(mContext,ScreenRecordActivity.class);
            mContext.startActivity(intent);
        }else if(!ScreenUtil.isRecordScreen()){
            ScreenRecordActivity.instance.collapseStatusBar();
            Intent intent = new Intent(mContext,ScreenRecordActivity.class);
            intent.putExtra("srartRecordScreen",true);
            mContext.startActivity(intent);
        }else{
            ScreenUtil.stopScreenRecord();
        }

    }

    public boolean isEnabled(){
        return mRecordScreenEnabled;
    }

    public synchronized boolean isAvailable() {
        return mTorchAvailable;
    }

    public void setRecordScreen(boolean newState){
        mRecordScreenEnabled = newState;
    }

    public void addCallback(RecordScreenListener callback) {
        mListeners.add(callback);
        notifyChanged(callback);
    }

    public void removeCallback(RecordScreenListener callback) {
        mListeners.remove(callback);
    }


    private void notifyChanged() {
        for (RecordScreenListener listener : mListeners) {
            notifyChanged(listener);
        }
    }

    private void notifyChanged(RecordScreenListener listener) {
        listener.onRecordScreenChanged(false);
    }
}

3.system ui中显示图标RecordScreenTitle.java

因为我是把这个控制接口放在system ui中实现所以继承该类的状态方法,如果需要放在其他应用可以自己修改。

package com.android.systemui.qs.tiles;

import android.app.ActivityManager;
import android.content.Intent;
import android.content.Context;
import android.os.Bundle;
import android.os.IBinder;
import android.graphics.drawable.Drawable;
import android.provider.MediaStore;
import android.service.quicksettings.Tile;
import android.widget.Switch;
import android.content.ServiceConnection;
import android.content.ComponentName;
import android.app.Application;

import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import com.android.systemui.Dependency;
import com.android.systemui.R;
import com.android.systemui.plugins.qs.QSTile.BooleanState;
import com.android.systemui.qs.QSHost;
import com.android.systemui.qs.tileimpl.QSTileImpl;
import com.android.systemui.statusbar.policy.RecordScreenController;
import com.android.systemui.util.ScreenUtil;
import android.util.Log;

import com.android.systemui.ScreenRecordActivity;
import android.widget.Toast;

/**
 * Quick settings tile: Control RecordScreen
 **/
public class RecordScreenTitle extends QSTileImpl<BooleanState> implements
        RecordScreenController.RecordScreenListener {

    private final String TAG = "RecordScreenTitle";
    private final Icon startIcon = ResourceIcon.get(R.drawable.ic_start_record_screen);
    private final Icon stopIcon = ResourceIcon.get(R.drawable.ic_stop_record_screen);

    private final RecordScreenController mRecordScreenController;
    private ServiceConnection mServiceConnection;
    private BooleanState mState;

    public RecordScreenTitle(QSHost host) {
        super(host);
        mRecordScreenController = Dependency.get(RecordScreenController.class);
    }

    @Override
    protected void handleDestroy() {
        super.handleDestroy();
    }

    @Override
    public BooleanState newTileState() {
        return new BooleanState();
    }

    @Override
    public void handleSetListening(boolean listening) {
        if (listening) {
            mRecordScreenController.addCallback(this);
        } else {
            mRecordScreenController.removeCallback(this);
        }
    }

    @Override
    protected void handleUserSwitch(int newUserId) {
    }

    @Override
    public Intent getLongClickIntent() {
        return new Intent();
    }

    @Override
    protected void handleClick() {
        if (ActivityManager.isUserAMonkey()) {
            return;
        }
        boolean newState = !mState.value;
        mRecordScreenController.setRecordScreenController(newState);
        refreshState(newState);
        Log.d(TAG, "handleClick newState = " + newState);

    }

    @Override
    public CharSequence getTileLabel() {
        return mContext.getString(R.string.quick_settings_record_screen_label);
    }

    @Override
    public int getMetricsCategory() {
        return 0;
    }

    @Override
    protected void handleLongClick() {
        handleClick();
    }

    @Override
    protected void handleUpdateState(BooleanState state, Object arg) {
        mState = state;
        if (state.slash == null) {
            state.slash = new SlashState();
        }
        state.label = mHost.getContext().getString(R.string.quick_settings_record_screen_label);
        if (!mRecordScreenController.isAvailable()) {
            state.icon = startIcon;
            state.slash.isSlashed = true;
            state.contentDescription = mContext.getString(
                    R.string.accessibility_quick_settings_record_screen_unavailable);
            state.state = Tile.STATE_UNAVAILABLE;
            return;
        }
        boolean value = ScreenUtil.isRecordScreen();
        if (value) {
            state.label = mContext.getString(R.string.accessibility_quick_settings_record_screen_changed_off);
            state.icon = stopIcon;
        } else {
            state.label = mContext.getString(R.string.accessibility_quick_settings_record_screen_changed_on);
            state.icon = startIcon;
        }
        state.value = !value;
        state.slash.isSlashed = !state.value;
        state.contentDescription = mContext.getString(R.string.quick_settings_record_screen_label);
        state.expandedAccessibilityClassName = Switch.class.getName();
        state.state = state.value ? Tile.STATE_ACTIVE : Tile.STATE_INACTIVE;
        Log.d(TAG, "handleUpdateState  "  + " state.value = " + state.value);
    }

    @Override
    protected String composeChangeAnnouncement() {
        if (mState.value) {
            return mContext.getString(R.string.accessibility_quick_settings_record_screen_changed_on);
        } else {
            return mContext.getString(R.string.accessibility_quick_settings_record_screen_changed_off);
        }
    }

    @Override
    public void onRecordScreenChanged(boolean enabled) {
        refreshState(enabled);
    }


}

猜你喜欢

转载自blog.csdn.net/zhuxingchong/article/details/86605589