根据项目要求,需要在setting中添加一项专门管理直播设置的内容,添加步骤如下(参考displaysetting 进行添加):
--- a/packages/apps/Settings/res/xml/top_level_settings.xml
+++ b/packages/apps/Settings/res/xml/top_level_settings.xml
@@ -54,14 +54,23 @@
android:title="@string/configure_notification_settings"
android:summary="@string/notification_dashboard_summary"/>
+<!-- <Preference-->
+<!-- android:fragment="com.android.settings.fuelgauge.PowerUsageSummary"-->
+<!-- android:icon="@drawable/ic_settings_battery_white"-->
+<!-- android:key="top_level_battery"-->
+<!-- android:order="-110"-->
+<!-- android:title="@string/power_usage_summary_title"-->
+<!-- android:summary="@string/summary_placeholder"-->
+<!-- settings:controller="com.android.settings.fuelgauge.TopLevelBatteryPreferenceController"/>-->
+
<Preference
- android:fragment="com.android.settings.fuelgauge.PowerUsageSummary"
- android:icon="@drawable/ic_settings_battery_white"
- android:key="top_level_battery"
+ android:fragment="com.android.settings.LiveSettings"
+ android:icon="@drawable/ic_settings_display_white"
+ android:key="top_level_live"
android:order="-110"
- android:title="@string/power_usage_summary_title"
- android:summary="@string/summary_placeholder"
- settings:controller="com.android.settings.fuelgauge.TopLevelBatteryPreferenceController"/>
+ android:title="@string/live_settings"
+ android:summary="@string/live_settings"
+ settings:controller="com.android.settings.klive.TopLevelLivePreferenceController"/>
<Preference
android:fragment="com.android.settings.deviceinfo.StorageDashboardFragment"
参考displaysetting,将电池相关的setting更改为livesetting,提供livesetting的fragment:com.android.settings.LiveSettings ,controller:com.android.settings.klive.TopLevelLivePreferenceController
+++ b/packages/apps/Settings/src/com/android/settings/LiveSettings.java
@@ -0,0 +1,83 @@
+/*
+ * Copyright (C) 2010 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings;
+
+import android.app.settings.SettingsEnums;
+import android.content.Context;
+import android.os.Bundle;
+
+import com.android.settings.dashboard.DashboardFragment;
+import com.android.settings.klive.FakeCameraSwitchPreferenceController;
+import com.android.settings.search.BaseSearchIndexProvider;
+import com.android.settingslib.core.AbstractPreferenceController;
+import com.android.settingslib.core.lifecycle.Lifecycle;
+import com.android.settingslib.search.SearchIndexable;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@SearchIndexable(forTarget = SearchIndexable.ALL & ~SearchIndexable.ARC)
+public class LiveSettings extends DashboardFragment {
+ private static final String TAG = "LiveSettings";
+
+ @Override
+ public int getMetricsCategory() {
+ return SettingsEnums.LIVE;
+ }
+
+ @Override
+ protected String getLogTag() {
+ return TAG;
+ }
+
+ @Override
+ protected int getPreferenceScreenResId() {
+ return R.xml.live_settings;
+ }
+
+ @Override
+ public void onCreate(Bundle icicle) {
+ super.onCreate(icicle);
+ }
+
+ @Override
+ protected List<AbstractPreferenceController> createPreferenceControllers(Context context) {
+ return buildPreferenceControllers(context, getSettingsLifecycle());
+ }
+
+ @Override
+ public int getHelpResource() {
+ return R.string.help_uri_display;
+ }
+
+ private static List<AbstractPreferenceController> buildPreferenceControllers(
+ Context context, Lifecycle lifecycle) {
+ final List<AbstractPreferenceController> controllers = new ArrayList<>();
//controller中的key"fake_camera" 必须和xml中的key保持一致不然getPreferenceKey()方法会返回空,导致空指针
+ controllers.add(new FakeCameraSwitchPreferenceController(context,"fake_camera"));
+ return controllers;
+ }
+
+ public static final BaseSearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
+ new BaseSearchIndexProvider(R.xml.live_settings) {
+
+ @Override
+ public List<AbstractPreferenceController> createPreferenceControllers(
+ Context context) {
+ return buildPreferenceControllers(context, null);
+ }
+ };
+}
+++ b/packages/apps/Settings/src/com/android/settings/klive/TopLevelLivePreferenceController.java
@@ -0,0 +1,35 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.klive;
+
+import android.content.Context;
+
+import com.android.settings.R;
+import com.android.settings.core.BasePreferenceController;
+
+public class TopLevelLivePreferenceController extends BasePreferenceController {
+
+ public TopLevelLivePreferenceController(Context context, String preferenceKey) {
+ super(context, preferenceKey);
+ }
+
+ @Override
+ public int getAvailabilityStatus() {
+ return AVAILABLE;
+
+ }
+}
+++ b/packages/apps/Settings/res/xml/live_settings.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2016 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<PreferenceScreen
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:settings="http://schemas.android.com/apk/res-auto"
+ android:key="live_settings_screen"
+ android:title="@string/live_settings"
+ settings:keywords="@string/keywords_live">
+
+ <PreferenceCategory
//一个组的名称
+ android:title="@string/category_name_fake_camera">
+
+ <SwitchPreference
//PreferenceKey 很重要 加载布局时需要根据这个来加载
+ android:key="fake_camera"
+ android:title="@string/fake_camera_switch"
//关键字
+ settings:keywords="@string/category_name_fake_camera"
//forwork 设置为true代表这个功能一直可用,不会置为灰色
+ settings:forWork="true"
//该界面具体功能逻辑实现
+ settings:controller="com.android.settings.klive.FakeCameraSwitchPreferenceController"/>
+
+ </PreferenceCategory>
+
+
+
+</PreferenceScreen>
此xml即为livesetting的布局文件,目前只添加了虚拟摄像头开关这一个选项,后续需要增加可以参考添加
要实现虚拟摄像头开关 相关逻辑需要添加到controller当中
+++ b/packages/apps/Settings/src/com/android/settings/klive/FakeCameraSwitchPreferenceController.java
@@ -0,0 +1,78 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file
+ * except in compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the
+ * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the specific language governing
+ * permissions and limitations under the License.
+ */
+package com.android.settings.klive;
+
+import android.app.settings.SettingsEnums;
+import android.content.Context;
+import android.os.Build;
+import android.provider.Settings;
+import android.text.TextUtils;
+
+import androidx.annotation.RequiresApi;
+import androidx.preference.Preference;
+
+import com.android.settings.core.PreferenceControllerMixin;
+import com.android.settings.core.TogglePreferenceController;
+import com.android.settings.overlay.FeatureFactory;
+import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
+import com.android.settingslib.core.lifecycle.LifecycleObserver;
+
+public class FakeCameraSwitchPreferenceController extends TogglePreferenceController implements
+ PreferenceControllerMixin, Preference.OnPreferenceChangeListener, LifecycleObserver{
+
+ private final MetricsFeatureProvider mMetricsFeatureProvider;
+ private Preference mPreference;
+ //此处的key必须和xml里面的key保持一致 不然会导致报错 空指针
+ public FakeCameraSwitchPreferenceController(Context context, String key) {
+ super(context, key);
+ mMetricsFeatureProvider = FeatureFactory.getFactory(context).getMetricsFeatureProvider();
+ }
+
+ @Override
+ public int getAvailabilityStatus() {
+ return AVAILABLE;
+ }
+
+ @Override
+ public void updateState(Preference preference) {
+ mPreference = preference;
+ super.updateState(preference);
+ }
+
+
+
+ @Override
+ public boolean isSliceable() {
+ return TextUtils.equals(getPreferenceKey(), "fake_camera");
+ }
+
+ @Override
+ public boolean isPublicSlice() {
+ return true;
+ }
+
+ @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR1)
+ @Override
+ public boolean isChecked() {
+ return Settings.Global.getInt(mContext.getContentResolver(),Settings.Global.USE_FAKE_CAMERA,1)==1;
+ }
+
+ @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR1)
+ @Override
+ public boolean setChecked(boolean isChecked) {
+ final int useFakeCamera=isChecked?1:0;
+ Settings.Global.putInt(mContext.getContentResolver(),Settings.Global.USE_FAKE_CAMERA,useFakeCamera);
+ return true;
+ }
+}
diff --git a/packages/apps/Settings/AndroidManifest.xml b/packages/apps/Settings/AndroidManifest.xml
old mode 100644
new mode 100755
index 5649d2e..50ed7d7
--- a/packages/apps/Settings/AndroidManifest.xml
+++ b/packages/apps/Settings/AndroidManifest.xml
@@ -974,6 +974,24 @@
android:value="true" />
</activity>
+ <!-- Live -->
+ <activity
+ android:name="Settings$LiveSettingsActivity"
+ android:label="@string/live_settings"
+ android:taskAffinity=""
+ android:exported="true">
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <category android:name="android.intent.category.DEFAULT" />
+ <category android:name="android.intent.category.VOICE_LAUNCH" />
+ <category android:name="com.android.settings.SHORTCUT" />
+ </intent-filter>
+ <meta-data android:name="com.android.settings.FRAGMENT_CLASS"
+ android:value="com.android.settings.klive.LiveSettings" />
+ <meta-data android:name="com.android.settings.PRIMARY_PROFILE_CONTROLLED"
+ android:value="true" />
+ </activity>
+
<activity
android:name="Settings$DisplaySettingsActivity"
android:label="@string/display_settings"
diff --git a/packages/apps/Settings/src/com/android/settings/Settings.java b/packages/apps/Settings/src/com/android/settings/Settings.java
old mode 100644
new mode 100755
index 00e07ed..b4a04ab
--- a/packages/apps/Settings/src/com/android/settings/Settings.java
+++ b/packages/apps/Settings/src/com/android/settings/Settings.java
@@ -103,6 +103,7 @@ public class Settings extends SettingsActivity {
public static class UserDictionarySettingsActivity extends SettingsActivity { /* empty */ }
public static class DarkThemeSettingsActivity extends SettingsActivity { /* empty */ }
public static class DisplaySettingsActivity extends SettingsActivity { /* empty */ }
+ public static class LiveSettingsActivity extends SettingsActivity { /* empty */ }
public static class NightDisplaySettingsActivity extends SettingsActivity { /* empty */ }
public static class NightDisplaySuggestionActivity extends NightDisplaySettingsActivity { /* empty */ }
public static class SmartAutoRotateSettingsActivity extends SettingsActivity { /* empty */ }
diff --git a/packages/apps/Settings/src/com/android/settings/core/gateway/SettingsGateway.java b/packages/apps/Settings/src/com/android/settings/core/gateway/SettingsGateway.java
old mode 100644
new mode 100755
index 0316fba..ac02d12
--- a/packages/apps/Settings/src/com/android/settings/core/gateway/SettingsGateway.java
+++ b/packages/apps/Settings/src/com/android/settings/core/gateway/SettingsGateway.java
@@ -19,6 +19,7 @@ package com.android.settings.core.gateway;
import com.android.settings.AllInOneTetherSettings;
import com.android.settings.DisplaySettings;
import com.android.settings.IccLockSettings;
+import com.android.settings.LiveSettings;
import com.android.settings.MainClear;
import com.android.settings.MainClearConfirm;
import com.android.settings.Settings;
@@ -199,6 +200,7 @@ public class SettingsGateway {
UserDictionaryList.class.getName(),
UserDictionarySettings.class.getName(),
DisplaySettings.class.getName(),
+ LiveSettings.class.getName(),
MyDeviceInfoFragment.class.getName(),
ModuleLicensesDashboard.class.getName(),
ManageApplications.class.getName(),
@@ -331,6 +333,7 @@ public class SettingsGateway {
Settings.NetworkDashboardActivity.class.getName(),
Settings.ConnectedDeviceDashboardActivity.class.getName(),
Settings.AppDashboardActivity.class.getName(),
+ Settings.LiveSettingsActivity.class.getName(),
Settings.DisplaySettingsActivity.class.getName(),
Settings.SoundSettingsActivity.class.getName(),
Settings.StorageDashboardActivity.class.getName(),
diff --git a/packages/apps/Settings/src/com/android/settings/dashboard/DashboardFragmentRegistry.java b/packages/apps/Settings/src/com/android/settings/dashboard/DashboardFragmentRegistry.java
old mode 100644
new mode 100755
index 8ca2bee..6864a68
--- a/packages/apps/Settings/src/com/android/settings/dashboard/DashboardFragmentRegistry.java
+++ b/packages/apps/Settings/src/com/android/settings/dashboard/DashboardFragmentRegistry.java
@@ -20,6 +20,7 @@ import android.util.ArrayMap;
import com.android.settings.DisplaySettings;
import com.android.settings.LegalSettings;
+import com.android.settings.LiveSettings;
import com.android.settings.accounts.AccountDashboardFragment;
import com.android.settings.accounts.AccountDetailDashboardFragment;
import com.android.settings.applications.AppDashboardFragment;
@@ -79,6 +80,8 @@ public class DashboardFragmentRegistry {
CategoryKey.CATEGORY_DEVICE);
PARENT_TO_CATEGORY_KEY_MAP.put(AppDashboardFragment.class.getName(),
CategoryKey.CATEGORY_APPS);
+ PARENT_TO_CATEGORY_KEY_MAP.put(LiveSettings.class.getName(),
+ CategoryKey.CATEGORY_LIVE);
PARENT_TO_CATEGORY_KEY_MAP.put(PowerUsageSummary.class.getName(),
CategoryKey.CATEGORY_BATTERY);
PARENT_TO_CATEGORY_KEY_MAP.put(DisplaySettings.class.getName(),
diff --git a/frameworks/base/packages/SettingsLib/src/com/android/settingslib/drawer/CategoryKey.java b/frameworks/base/packages/SettingsLib/src/com/android/settingslib/drawer/CategoryKey.java
old mode 100644
new mode 100755
index 0d544be..fdc6334
--- a/frameworks/base/packages/SettingsLib/src/com/android/settingslib/drawer/CategoryKey.java
+++ b/frameworks/base/packages/SettingsLib/src/com/android/settingslib/drawer/CategoryKey.java
@@ -30,6 +30,7 @@ public final class CategoryKey {
public static final String CATEGORY_APPS = "com.android.settings.category.ia.apps";
public static final String CATEGORY_APPS_DEFAULT =
"com.android.settings.category.ia.apps.default";
+ public static final String CATEGORY_LIVE = "com.android.settings.category.ia.live";
public static final String CATEGORY_BATTERY = "com.android.settings.category.ia.battery";
public static final String CATEGORY_DISPLAY = "com.android.settings.category.ia.display";
public static final String CATEGORY_SOUND = "com.android.settings.category.ia.sound";
diff --git a/frameworks/proto_logging/stats/enums/app/settings_enums.proto b/frameworks/proto_logging/stats/enums/app/settings_enums.proto
old mode 100644
new mode 100755
index 173cc72..556fd23
--- a/frameworks/proto_logging/stats/enums/app/settings_enums.proto
+++ b/frameworks/proto_logging/stats/enums/app/settings_enums.proto
@@ -3180,6 +3180,11 @@ enum PageId {
// CATEGORY: SETTINGS
// OS: S
SETTINGS_BUTTON_NAV_DLG = 1907;
+
+ // OPEN: Settings >Live
+ // CATEGORY: SETTINGS
+ // OS: S
+ LIVE = 1908;
}
// Battery Saver schedule types.
通过以上步骤 能顺利添加新的setting项到 setting主界面中。
当我使用Bundler时,是否需要在我的Gemfile中将其列为依赖项?毕竟,我的代码中有些地方需要它。例如,当我进行Bundler设置时:require"bundler/setup" 最佳答案 没有。您可以尝试,但首先您必须用鞋带将自己抬离地面。 关于ruby-我需要将Bundler本身添加到Gemfile中吗?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/4758609/
我有一个ModularSinatra应用程序,我正在尝试将Bootstrap添加到应用程序中。get'/bootstrap/application.css'doless:"bootstrap/bootstrap"end我在views/bootstrap中有所有less文件,包括bootstrap.less。我收到这个错误:Less::ParseErrorat/bootstrap/application.css'reset.less'wasn'tfound.Bootstrap.less的第一行是://CSSReset@import"reset.less";我尝试了所有不同的路径格式,但它
我正在使用Sequel构建一个愿望list系统。我有一个wishlists和itemstable和一个items_wishlists连接表(该名称是续集选择的名称)。items_wishlists表还有一个用于facebookid的额外列(因此我可以存储opengraph操作),这是一个NOTNULL列。我还有Wishlist和Item具有续集many_to_many关联的模型已建立。Wishlist类也有:selectmany_to_many关联的选项设置为select:[:items.*,:items_wishlists__facebook_action_id].有没有一种方法可以
当谈到运行时自省(introspection)和动态代码生成时,我认为ruby没有任何竞争对手,可能除了一些lisp方言。前几天,我正在做一些代码练习来探索ruby的动态功能,我开始想知道如何向现有对象添加方法。以下是我能想到的3种方法:obj=Object.new#addamethoddirectlydefobj.new_method...end#addamethodindirectlywiththesingletonclassclass这只是冰山一角,因为我还没有探索instance_eval、module_eval和define_method的各种组合。是否有在线/离线资
我注意到类定义,如果我打开classMyClass,并在不覆盖的情况下添加一些东西我仍然得到了之前定义的原始方法。添加的新语句扩充了现有语句。但是对于方法定义,我仍然想要与类定义相同的行为,但是当我打开defmy_method时似乎,def中的现有语句和end被覆盖了,我需要重写一遍。那么有什么方法可以使方法定义的行为与定义相同,类似于super,但不一定是子类? 最佳答案 我想您正在寻找alias_method:classAalias_method:old_func,:funcdeffuncold_func#similartoca
我有带有Logo图像的公司模型has_attached_file:logo我用他们的Logo创建了许多公司。现在,我需要添加新样式has_attached_file:logo,:styles=>{:small=>"30x15>",:medium=>"155x85>"}我是否应该重新上传所有旧数据以重新生成新样式?我不这么认为……或者有什么rake任务可以重新生成样式吗? 最佳答案 参见Thumbnail-Generation.如果rake任务不适合你,你应该能够在控制台中使用一个片段来调用重新处理!关于相关公司
我正在尝试使用Curbgem执行以下POST以解析云curl-XPOST\-H"X-Parse-Application-Id:PARSE_APP_ID"\-H"X-Parse-REST-API-Key:PARSE_API_KEY"\-H"Content-Type:image/jpeg"\--data-binary'@myPicture.jpg'\https://api.parse.com/1/files/pic.jpg用这个:curl=Curl::Easy.new("https://api.parse.com/1/files/lion.jpg")curl.multipart_form_
最近因为项目需要,需要将Android手机系统自带的某个系统软件反编译并更改里面某个资源,并重新打包,签名生成新的自定义的apk,下面我来介绍一下我的实现过程。APK修改,分为以下几步:反编译解包,修改,重打包,修改签名等步骤。安卓apk修改准备工作1.系统配置好JavaJDK环境变量2.需要root权限的手机(针对系统自带apk,其他软件免root)3.Auto-Sign签名工具4.apktool工具安卓apk修改开始反编译本文拿Android系统里面的Settings.apk做demo,具体如何将apk获取出来在此就不过多介绍了,直接进入主题:按键win+R输入cmd,打开命令窗口,并将路
我正在开发一个创建网络博客的RubyonRails项目。我希望将一个名为featured的boolean数据库字段添加到Post模型中。该字段应该可以通过我添加的事件管理界面进行编辑。我使用了以下代码,但我什至没有在网站上显示另一列。$railsgeneratemigrationaddFeaturedfeatured:boolean$rakedb:migrate我是RubyonRails的新手,非常感谢任何帮助。我的index.html.erb文件中的相关代码(views):FeaturedPost架构.rb:ActiveRecord::Schema.define(:version=>
假设我有一个这样的单例类:classSettingsincludeSingletondeftimeout#lazy-loadtimeoutfromconfigfile,orwhateverendend现在,如果我想知道使用什么超时,我需要编写如下内容:Settings.instance.timeout但我宁愿将其缩短为Settings.timeout使这项工作有效的一个明显方法是将设置的实现修改为:classSettingsincludeSingletondefself.timeoutinstance.timeoutenddeftimeout#lazy-loadtimeoutfromc