SystemUI中QuickSettings增加截图按钮(基于Android Q)

1:首先Systemui中的res/values/config.xml :
新增screenshot

    <!-- The default tiles to display in QuickSettings -->
    <string name="quick_settings_tiles_default" translatable="false">
        wifi,bt,dnd,flashlight,screenshot,location,rotation,battery,cell,airplane,cast
    </string>

    <!-- The minimum number of tiles to display in QuickSettings -->
    <integer name="quick_settings_min_num_tiles">6</integer>

    <!-- Tiles native to System UI. Order should match "quick_settings_tiles_default" -->
    <string name="quick_settings_tiles_stock" translatable="false">
        wifi,cell,battery,dnd,flashlight,screenshot,rotation,bt,airplane,location,hotspot,inversion,saver,dark,work,cast,night
    </string>

2:增加一个ScreenshotTile.java(照猫画虎,参考其他的title)

package com.android.systemui.qs.tiles;

import android.app.ActivityManager;
import android.content.Intent;
import android.service.quicksettings.Tile;
import android.widget.Switch;

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.internal.util.ScreenshotHelper;
import android.os.RemoteException;
import android.os.Handler;
import android.util.Log;
import android.os.Message;
import javax.inject.Inject;

/** Quick settings tile: Control flashlight **/
public class ScreenshotTile extends QSTileImpl<BooleanState>{

    private final Icon mIcon = ResourceIcon.get(com.android.internal.R.drawable.ic_screenshot);
    private ScreenshotHelper mScreenshotHelper;
    private Handler mHandler;

    //这个Inject还是必须要有的,不然会导致编译不过,一开始就入坑了
    @Inject
    public ScreenshotTile(QSHost host) {
        super(host);
        mHandler = new Handler();
        mScreenshotHelper = new ScreenshotHelper(mContext);
    }

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

    @Override
    protected void handleClick() {
        mHost.collapsePanels();

        mHandler.postDelayed(new Runnable() {
            @Override
            public void run() {
                Log.e(TAG, "gww ScreenshotAction onPress will takeScreenshot");
                //我这里是参考的原生的,长按power键出现的截图的方法。
                mScreenshotHelper.takeScreenshot(1, true, true, mHandler);
                }
            }, 500);
    }

    @Override
    protected void handleUpdateState(BooleanState state, Object arg) {
        state.icon = mIcon;
        state.label = mContext.getString(R.string.quick_settings_screenshot_label);
        state.contentDescription = mContext.getString(R.string.quick_settings_screenshot_label);
    }

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

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

    @Override
    protected void handleSetListening(boolean listening) {

    }

    @Override
    public CharSequence getTileLabel() {
    //quick_settings_screenshot_label 这种字符串String.xml中添加就可以了
        return mContext.getString(R.string.quick_settings_screenshot_label);
    }

}

3:最重要的是添加title的地方
src/com/android/systemui/qs/tileimpl/QSFactoryImpl.java —>createTileInternal()

    private QSTileImpl createTileInternal(String tileSpec) {
        // Stock tiles.
        switch (tileSpec) {
        .......
            case "flashlight":
                return mFlashlightTileProvider.get();
                /*新增screenshot*/
            case "screenshot":
                return mScreenshotTileProvider.get();
public class QSFactoryImpl implements QSFactory {

    private static final String TAG = "QSFactory";

    private final Provider<WifiTile> mWifiTileProvider;
    private final Provider<BluetoothTile> mBluetoothTileProvider;
    private final Provider<CellularTile> mCellularTileProvider;
    private final Provider<DndTile> mDndTileProvider;
    private final Provider<ColorInversionTile> mColorInversionTileProvider;
    private final Provider<AirplaneModeTile> mAirplaneModeTileProvider;
    private final Provider<WorkModeTile> mWorkModeTileProvider;
    private final Provider<RotationLockTile> mRotationLockTileProvider;
    private final Provider<FlashlightTile> mFlashlightTileProvider;
    //**新增ScreenshotTile**
    private final Provider<ScreenshotTile> mScreenshotTileProvider;
   @Inject
    public QSFactoryImpl(Provider<WifiTile> wifiTileProvider,
            Provider<BluetoothTile> bluetoothTileProvider,
            Provider<CellularTile> cellularTileProvider,
            Provider<DndTile> dndTileProvider,
            Provider<ColorInversionTile> colorInversionTileProvider,
            Provider<AirplaneModeTile> airplaneModeTileProvider,
            Provider<WorkModeTile> workModeTileProvider,
            Provider<RotationLockTile> rotationLockTileProvider,
            Provider<FlashlightTile> flashlightTileProvider,
            //**ScreenshotTile**
            Provider<ScreenshotTile> screenshotTileProvider,
            Provider<LocationTile> locationTileProvider,
            Provider<CastTile> castTileProvider,
            Provider<HotspotTile> hotspotTileProvider,
            Provider<UserTile> userTileProvider,
            Provider<BatterySaverTile> batterySaverTileProvider,
            Provider<DataSaverTile> dataSaverTileProvider,
            Provider<NightDisplayTile> nightDisplayTileProvider,
            Provider<NfcTile> nfcTileProvider,
            Provider<GarbageMonitor.MemoryTile> memoryTileProvider,
            Provider<UiModeNightTile> uiModeNightTileProvider) {
        mWifiTileProvider = wifiTileProvider;
        mBluetoothTileProvider = bluetoothTileProvider;
        mCellularTileProvider = cellularTileProvider;
        mDndTileProvider = dndTileProvider;
        mColorInversionTileProvider = colorInversionTileProvider;
        mAirplaneModeTileProvider = airplaneModeTileProvider;
        mWorkModeTileProvider = workModeTileProvider;
        mRotationLockTileProvider = rotationLockTileProvider;
        mFlashlightTileProvider = flashlightTileProvider;
        //**ScreenshotTile**
        mScreenshotTileProvider = screenshotTileProvider;
        mLocationTileProvider = locationTileProvider;

主要代码就是如此,其他的小问题,解决即可

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值