版权声明:本文为博主原创文章,未经博主允许不得转载。 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);
}
}