在本文中,我们将详细介绍Logback-Android:将FixedWindowRollingPolicy与SizeBasedTriggeringPolicy一起使用时出现“无适用操作”错误的各个方面
在本文中,我们将详细介绍Logback-Android:将FixedWindowRollingPolicy与SizeBasedTriggeringPolicy一起使用时出现“无适用操作”错误的各个方面,同时,我们也将为您带来关于Android AudioPolicyService 和 AudioPolicyManager、Android AudioPolicyService和AudioPolicyManager、android – devicePolicyManager.lockNow()不适用于Motorola Tablets、android – NestedScrollView在与CollapsingToolbarLayout一起使用时不会滚动到结尾的有用知识。
本文目录一览:- Logback-Android:将FixedWindowRollingPolicy与SizeBasedTriggeringPolicy一起使用时出现“无适用操作”错误
- Android AudioPolicyService 和 AudioPolicyManager
- Android AudioPolicyService和AudioPolicyManager
- android – devicePolicyManager.lockNow()不适用于Motorola Tablets
- android – NestedScrollView在与CollapsingToolbarLayout一起使用时不会滚动到结尾
Logback-Android:将FixedWindowRollingPolicy与SizeBasedTriggeringPolicy一起使用时出现“无适用操作”错误
它似乎工作正常,但当我有以下情况
>当大小达到50MB时旋转日志
>创建日志轮换时的备份文件.例如. testFile.1.log.zip
为此,我有以下logback.xml文件:
<configuration> <appender name="FILE"> <file>/sdcard/dappLog.log</file> <append>true</append> <encoder> <pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern> </encoder> <rollingPolicy> <fileNamePattern>/sdcard/dappLog.%i.log.zip</fileNamePattern> <minIndex>1</minIndex> <maxIndex>2</maxIndex> </rollingPolicy> <triggeringPolicy> <maxFileSize>50MB</maxFileSize> </triggeringPolicy> </appender> <root level="INFO"> <appender-ref ref="FILE" /> </root>
根据this答案,因为SizeBasedTriggerPolicy中有一个bug(src),所以我有以下实现:
`
package com.dapp.utilities; import java.io.File; import ch.qos.logback.core.util.FileSize; public class SizeBasedTriggeringPolicy<E> extends ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy<E> { @Override public boolean isTriggeringEvent(final File activeFile,final E event) { return (activeFile.length() >= FileSize.valueOf(getMaxFileSize()).getSize()); } }
`
但是,当我运行它时,我收到以下错误:
I/System.out( 2346): 16:14:20,750 |-ERROR in ch.qos.logback.core.joran.spi.Interpreter@8:85 - no applicable action for [rollingPolicy],current pattern is [[configuration][appender][rollingPolicy]] I/System.out( 2346): 16:14:20,757 |-ERROR in ch.qos.logback.core.joran.spi.Interpreter@9:30 - no applicable action for [fileNamePattern],current pattern is [[configuration][appender][rollingPolicy][fileNamePattern]] I/System.out( 2346): 16:14:20,763 |-ERROR in ch.qos.logback.core.joran.spi.Interpreter@10:23 - no applicable action for [minIndex],current pattern is [[configuration][appender][rollingPolicy][minIndex]] I/System.out( 2346): 16:14:20,770 |-ERROR in ch.qos.logback.core.joran.spi.Interpreter@11:23 - no applicable action for [maxIndex],current pattern is [[configuration][appender][rollingPolicy][maxIndex]] I/System.out( 2346): 16:14:20,777 |-ERROR in ch.qos.logback.core.joran.spi.Interpreter@14:90 - no applicable action for [triggeringPolicy],current pattern is [[configuration][appender][triggeringPolicy]] I/System.out( 2346): 16:14:20,820 |-ERROR in ch.qos.logback.core.joran.spi.Interpreter@15:26 - no applicable action for [maxFileSize],current pattern is [[configuration][appender][triggeringPolicy][maxFileSize]]
PS:我不熟悉logback.
解决方法
以下代码有效:
<configuration> <appender name="FILE"> <file>/sdcard/dapp.log</file> <append>false</append> <rollingPolicy> <fileNamePattern>/sdcard/dapp.%i.log.zip</fileNamePattern> <minIndex>1</minIndex> <maxIndex>2</maxIndex> </rollingPolicy> <triggeringPolicy> <maxFileSize>50MB</maxFileSize> </triggeringPolicy> <encoder> <pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern> </encoder> </appender> <root level="INFO"> <appender-ref ref="FILE"/> </root>
Android AudioPolicyService 和 AudioPolicyManager
AudioPolicyService 是 Android 音频系统的两大服务之一,另一个服务是 AudioFlinger,这两大服务都在系统启动时有 MediaSever 加载,加载的代码位于:frameworks\base\media\mediaserver \main_mediaserver.cpp。AudioFlinger 主要负责管理音频数据处理以及和硬件抽象层相关的工作。本文主要介绍 AudioPolicyService。AudioPolicyService
AudioPolicyService 主要完成以下任务:
JAVA 应用层通过 JNI,经由 IAudioPolicyService 接口,访问 AudioPolicyService 提供的服务 输入输出设备的连接状态系统的音频策略(strategy)的切换音量 / 音频参数的设置
AudioPolicyService 的构成
进一步说明:
1. AudioPolicyService 继承了 IAudioPolicyService 接口,这样 AudioPolicyService 就可以基于 Android 的 Binder 机制,向外部提供服务;
2. AudioPolicyService 同时也继承了 AudioPolicyClientInterface 类,他有一个 AudioPolicyInterface 类的成员指针 mpPolicyManager,实际上就是指向了 AudioPolicyManager;
3. AudioPolicyManager 类继承了 AudioPolicyInterface 类以便向 AudioPolicyService 提供服务,反过来同时还有一个 AudioPolicyClientInterface 指针,该指针在构造函数中被初始化,指向了 AudioPolicyService,实际上,AudioPolicyService 是通过成员指针 mpPolicyManager 访问 AudioPolicyManager,而 AudioPolicyManager 则通过 AudioPolicyClientInterface(mpClientInterface)访问 AudioPolicyService;
4. AudioPolicyService 有一个内部线程类 AudioCommandThread,顾名思义,所有的命令(音量控制,输入、输出的切换等)最终都会在该线程中排队执行;
AudioPolicyManager
AudioPolicyService 的很大一部分管理工作都是在 AudioPolicyManager 中完成的。包括音量管理,音频策略(strategy)管理,输入输出设备管理。
输入输出设备管理
音频系统为音频设备定义了一个枚举:AudioSystem::audio_devices,例如:DEVICE_OUT_SPEAKER,DEVICE_OUT_WIRED_HEADPHONE,DEVICE_OUT_BLUETOOTH_A2DP,DEVICE_IN_BUILTIN_MIC,DEVICE_IN_VOICE_CALL 等等,每一个枚举值其实对应一个 32bit 整数的某一个位,所以这些值是可以进行位或操作的,例如我希望同时打开扬声器和耳机,那么可以这样:
java 代码:
- newDevice = DEVICE_OUT_SPEAKER | DEVICE_OUT_WIRED_HEADPHONE;
- setOutputDevice(mHardwareOutput, newDevice);
AudioPolicyManager 中有两个成员变量:mAvailableOutputDevices 和 mAvailableInputDevices,他们记录了当前可用的输入和输出设备,当系统检测到耳机或者蓝牙已连接好时,会调用 AudioPolicyManager 的成员函数:
java 代码:
- status_t AudioPolicyManager::setDeviceConnectionState(AudioSystem::audio_devices device,
- AudioSystem::device_connection_state state,
- const char *device_address)
该函数根据传入的 device 值和 state(DEVICE_STATE_AVAILABLE/DEVICE_STATE_UNAVAILABLE)设置 mAvailableOutputDevices 或者 mAvailableInputDevices,然后选择相应的输入或者输出设备。
其他一些相关的函数:
java 代码:
- setForceUse()
- // 设置某种场合强制使用某一设备,例如 setForceUse (FOR_MEDIA, FORCE_SPEAKER) 会在播放音乐时打开扬声器
- startOutput()/stopOutput()
- startInput()/stopInput()
音量管理
AudioPolicyManager 提供了一下几个与音量相关的函数:
java 代码:
- initStreamVolume(AudioSystem::stream_type stream, int indexMin, int indexMax)
- setStreamVolumeIndex(AudioSystem::stream_type stream, int index)
- getStreamVolumeIndex(AudioSystem::stream_type stream)
由此可见,电话铃声可以有 7 个级别的音量,而音乐则可以有 15 个音量级别,java 的代码通过 jni,最后调用 AudioPolicyManager 的 initStreamVolume (),把这个数组的内容传入 AudioPolicyManager 中,这样 AudioPolicyManager 也就记住了每一个音频流的音量级别。应用程序可以调用 setStreamVolumeIndex 设置各个音频流的音量级别,setStreamVolumeIndex 会把这个整数的音量级别转化为适合人耳的对数级别,然后通过 AudioPolicyService 的 AudioCommandThread,最终会将设置应用到 AudioFlinger 的相应的 Track 中。
Android AudioPolicyService和AudioPolicyManager
AudioPolicyService是Android音频系统的两大服务之一,另一个服务是AudioFlinger,这两大服务都在系统启动时有 MediaSever加载,加载的代码位于:frameworks\base\media\mediaserver \main_mediaserver.cpp。AudioFlinger主要负责管理音频数据处理以及和硬件抽象层相关的工作。本文主要介绍 AudioPolicyService。AudioPolicyService
AudioPolicyService主要完成以下任务:
JAVA应用层通过JNI,经由IAudioPolicyService接口,访问AudioPolicyService提供的服务 输入输出设备的连接状态系统的音频策略(strategy)的切换音量/音频参数的设置
AudioPolicyService的构成
进一步说明:
1. AudioPolicyService继承了IAudioPolicyService接口,这样AudioPolicyService就可以基于Android的Binder机制,向外部提供服务;
2. AudioPolicyService同时也继承了AudioPolicyClientInterface类,他有一个AudioPolicyInterface类的成员指针mpPolicyManager,实际上就是指向了AudioPolicyManager;
3. AudioPolicyManager类继承了AudioPolicyInterface类以便向AudioPolicyService提供服务,反过来同时还有一个AudioPolicyClientInterface指针,该指针在构造函数中被初始化,指向了AudioPolicyService,实际上,AudioPolicyService是通过成员指针mpPolicyManager访问AudioPolicyManager,而 AudioPolicyManager则通过AudioPolicyClientInterface(mpClientInterface)访问 AudioPolicyService;
4. AudioPolicyService有一个内部线程类AudioCommandThread,顾名思义,所有的命令(音量控制,输入、输出的切换等)最终都会在该线程中排队执行;
AudioPolicyManager
AudioPolicyService的很大一部分管理工作都是在AudioPolicyManager中完成的。包括音量管理,音频策略(strategy)管理,输入输出设备管理。
输入输出设备管理
音频系统为音频设备定义了一个枚举:AudioSystem::audio_devices,例如:DEVICE_OUT_SPEAKER,DEVICE_OUT_WIRED_HEADPHONE,DEVICE_OUT_BLUETOOTH_A2DP,DEVICE_IN_BUILTIN_MIC,DEVICE_IN_VOICE_CALL 等等,每一个枚举值其实对应一个32bit整数的某一个位,所以这些值是可以进行位或操作的,例如我希望同时打开扬声器和耳机,那么可以这样:
java代码:
- newDevice = DEVICE_OUT_SPEAKER | DEVICE_OUT_WIRED_HEADPHONE;
- setOutputDevice(mHardwareOutput, newDevice);
AudioPolicyManager中有两个成员变量:mAvailableOutputDevices和 mAvailableInputDevices,他们记录了当前可用的输入和输出设备,当系统检测到耳机或者蓝牙已连接好时,会调用 AudioPolicyManager的成员函数:
java代码:
- status_t AudioPolicyManager::setDeviceConnectionState(AudioSystem::audio_devices device,
- AudioSystem::device_connection_state state,
- const char *device_address)
该函数根据传入的device值和 state(DEVICE_STATE_AVAILABLE/DEVICE_STATE_UNAVAILABLE)设置 mAvailableOutputDevices或者mAvailableInputDevices,然后选择相应的输入或者输出设备。
其他一些相关的函数:
java代码:
- setForceUse()
- //设置某种场合强制使用某一设备,例如setForceUse(FOR_MEDIA, FORCE_SPEAKER)会在播放音乐时打开扬声器
- startOutput()/stopOutput()
- startInput()/stopInput()
音量管理
AudioPolicyManager提供了一下几个与音量相关的函数:
java代码:
- initStreamVolume(AudioSystem::stream_type stream, int indexMin, int indexMax)
- setStreamVolumeIndex(AudioSystem::stream_type stream, int index)
- getStreamVolumeIndex(AudioSystem::stream_type stream)
由此可见,电话铃声可以有7个级别的音量,而音乐则可以有15个音量级别,java的代码通过jni,最后调用 AudioPolicyManager的initStreamVolume(),把这个数组的内容传入AudioPolicyManager中,这样 AudioPolicyManager也就记住了每一个音频流的音量级别。应用程序可以调用setStreamVolumeIndex设置各个音频流的音量级别,setStreamVolumeIndex会把这个整数的音量级别转化为适合人耳的对数级别,然后通过AudioPolicyService的 AudioCommandThread,最终会将设置应用到AudioFlinger的相应的Track中。
android – devicePolicyManager.lockNow()不适用于Motorola Tablets
public final static void lockDevice()
{
try
{
if (devicePolicyManager.isAdminActive(adminComponent))
{
devicePolicyManager.lockNow();
}
}
catch (final Exception ex)
{
...
}
}
上面的代码不会抛出任何异常,也不会锁定motorola xoom平板电脑的屏幕. (Homeycomb和Icecream Sandwitch)相同的代码在其他Homeycomb和ICS平板电脑上完美运行.
我用Google搜索,但没有得到任何解决方案.有任何想法吗…..?
解决方法:
这个问题的可能原因
1)我认为AndroidManifest.xml中接收者的元数据存在一些问题
2)您没有将正确的类(使用DeviceAdminReceiver扩展)添加到adminComponent或者接收者的android:name属性.
花了很多时间在这之后我创建了代码.
主要活动代码
public class LockerTest extends Activity {
protected static final int REQUEST_ENABLE = 0;
DevicePolicyManager devicePolicyManager;
ComponentName adminComponent;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button button = (Button) findViewById(R.id.btn);
button.setonClickListener(btnListener);
}
Button.OnClickListener btnListener = new Button.OnClickListener() {
public void onClick(View v) {
adminComponent = new ComponentName(LockerTest.this, Darclass.class);
devicePolicyManager = (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE);
if (!devicePolicyManager.isAdminActive(adminComponent)) {
Intent intent = new Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN);
intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN, adminComponent);
startActivityForResult(intent, REQUEST_ENABLE);
} else {
devicePolicyManager.lockNow();
}
}
};
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (REQUEST_ENABLE == requestCode) {
super.onActivityResult(requestCode, resultCode, data);
}
}
}
创建一个新类 – Darclass – 代码
import android.app.admin.DeviceAdminReceiver;
public class Darclass extends DeviceAdminReceiver{
}
在’res’中创建一个’xml’文件夹.然后在’xml’文件夹中创建my_admin.xml文件. my_admin.xml的代码.注意在< / activity>之后添加此接收器在< / application>之前
<device-admin xmlns:android="http://schemas.android.com/apk/res/android">
<uses-policies>
<limit-password />
<watch-login />
<reset-password />
<force-lock />
<wipe-data />
</uses-policies>
</device-admin>
最后将下面给出的接收器添加到AndroidManifest.xml中
<receiver
android:name=".Darclass"
android:permission="android.permission.BIND_DEVICE_ADMIN" >
<Meta-data
android:name="android.app.device_admin"
android:resource="@xml/my_admin" />
<intent-filter>
<action android:name="android.app.action.DEVICE_ADMIN_ENABLED" />
</intent-filter>
</receiver>
它应该适用于您的设备.
android – NestedScrollView在与CollapsingToolbarLayout一起使用时不会滚动到结尾
<android.support.design.widget.CoordinatorLayout android:fitsSystemWindows="true" android:layout_height="match_parent" android:layout_width="match_parent"> <android.support.design.widget.AppBarLayout android:fitsSystemWindows="true" android:layout_height="wrap_content" android:layout_width="match_parent"> <android.support.design.widget.CollapsingToolbarLayout android:fitsSystemWindows="true" android:layout_height="match_parent" android:layout_width="match_parent" app:contentScrim="?attr/colorPrimary" app:layout_scrollFlags="scroll|exitUntilCollapsed"> <ImageView android:fitsSystemWindows="true" android:layout_height="wrap_content" android:layout_width="match_parent" android:scaleType="centerCrop" android:src="@drawable/u8" app:layout_collapseMode="parallax"/> <android.support.v7.widget.Toolbar android:layout_height="?attr/actionBarSize" android:layout_width="match_parent" app:layout_collapseMode="pin"/> </android.support.design.widget.CollapsingToolbarLayout> </android.support.design.widget.AppBarLayout> <android.support.v4.widget.nestedScrollView android:clipToPadding="false" android:layout_height="match_parent" android:layout_width="match_parent" app:layout_behavior="@string/appbar_scrolling_view_behavior"> <LinearLayout android:layout_height="match_parent" android:layout_width="match_parent" android:orientation="vertical"> <!-- lots of widgets--> </LinearLayout> </android.support.v4.widget.nestedScrollView> </android.support.design.widget.CoordinatorLayout>
编辑:我注意到切割内容的高度与工具栏高度相同.
解决方法
在nestedScrollView之后放置AppBarLayout为我做了诀窍.如果它适合你,请告诉我.
关于Logback-Android:将FixedWindowRollingPolicy与SizeBasedTriggeringPolicy一起使用时出现“无适用操作”错误的介绍已经告一段落,感谢您的耐心阅读,如果想了解更多关于Android AudioPolicyService 和 AudioPolicyManager、Android AudioPolicyService和AudioPolicyManager、android – devicePolicyManager.lockNow()不适用于Motorola Tablets、android – NestedScrollView在与CollapsingToolbarLayout一起使用时不会滚动到结尾的相关信息,请在本站寻找。
本文标签: