GVKun编程网logo

Logback-Android:将FixedWindowRollingPolicy与SizeBasedTriggeringPolicy一起使用时出现“无适用操作”错误

13

在本文中,我们将详细介绍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一起使用时出现“无适用操作”错误

Logback-Android:将FixedWindowRollingPolicy与SizeBasedTriggeringPolicy一起使用时出现“无适用操作”错误

我在我的 Android应用程序中使用 logback-android将消息记录到文件,只要启用了日志记录(在app中配置).
它似乎工作正常,但当我有以下情况

>当大小达到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.

解决方法

我自己想出了这个问题.这是因为appender标签中的类属性错误.
以下代码有效:
<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

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 代码:
  1. newDevice = DEVICE_OUT_SPEAKER | DEVICE_OUT_WIRED_HEADPHONE; 
  2. setOutputDevice(mHardwareOutput, newDevice);
复制代码

       AudioPolicyManager 中有两个成员变量:mAvailableOutputDevices 和 mAvailableInputDevices,他们记录了当前可用的输入和输出设备,当系统检测到耳机或者蓝牙已连接好时,会调用 AudioPolicyManager 的成员函数:

java 代码:
  1. status_t AudioPolicyManager::setDeviceConnectionState(AudioSystem::audio_devices device, 
  2. AudioSystem::device_connection_state state, 
  3. const char *device_address)
复制代码

       该函数根据传入的 device 值和 state(DEVICE_STATE_AVAILABLE/DEVICE_STATE_UNAVAILABLE)设置 mAvailableOutputDevices 或者 mAvailableInputDevices,然后选择相应的输入或者输出设备。

       其他一些相关的函数:

java 代码:
  1. setForceUse() 
  2. // 设置某种场合强制使用某一设备,例如 setForceUse (FOR_MEDIA, FORCE_SPEAKER) 会在播放音乐时打开扬声器 
  3. startOutput()/stopOutput() 
  4. startInput()/stopInput()
复制代码

        音量管理
       AudioPolicyManager 提供了一下几个与音量相关的函数:

java 代码:
  1. initStreamVolume(AudioSystem::stream_type stream, int indexMin, int indexMax) 
  2. setStreamVolumeIndex(AudioSystem::stream_type stream, int index) 
  3. getStreamVolumeIndex(AudioSystem::stream_type stream)
复制代码

       由此可见,电话铃声可以有 7 个级别的音量,而音乐则可以有 15 个音量级别,java 的代码通过 jni,最后调用 AudioPolicyManager 的 initStreamVolume (),把这个数组的内容传入 AudioPolicyManager 中,这样 AudioPolicyManager 也就记住了每一个音频流的音量级别。应用程序可以调用 setStreamVolumeIndex 设置各个音频流的音量级别,setStreamVolumeIndex 会把这个整数的音量级别转化为适合人耳的对数级别,然后通过 AudioPolicyService 的 AudioCommandThread,最终会将设置应用到 AudioFlinger 的相应的 Track 中。

Android AudioPolicyService和AudioPolicyManager

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代码:
  1. newDevice = DEVICE_OUT_SPEAKER | DEVICE_OUT_WIRED_HEADPHONE; 
  2. setOutputDevice(mHardwareOutput, newDevice);
复制代码

       AudioPolicyManager中有两个成员变量:mAvailableOutputDevices和 mAvailableInputDevices,他们记录了当前可用的输入和输出设备,当系统检测到耳机或者蓝牙已连接好时,会调用 AudioPolicyManager的成员函数:

java代码:
  1. status_t AudioPolicyManager::setDeviceConnectionState(AudioSystem::audio_devices device, 
  2. AudioSystem::device_connection_state state, 
  3. const char *device_address)
复制代码

       该函数根据传入的device值和 state(DEVICE_STATE_AVAILABLE/DEVICE_STATE_UNAVAILABLE)设置 mAvailableOutputDevices或者mAvailableInputDevices,然后选择相应的输入或者输出设备。

       其他一些相关的函数:

java代码:
  1. setForceUse() 
  2. //设置某种场合强制使用某一设备,例如setForceUse(FOR_MEDIA, FORCE_SPEAKER)会在播放音乐时打开扬声器 
  3. startOutput()/stopOutput() 
  4. startInput()/stopInput()
复制代码

        音量管理
       AudioPolicyManager提供了一下几个与音量相关的函数:

java代码:
  1. initStreamVolume(AudioSystem::stream_type stream, int indexMin, int indexMax) 
  2. setStreamVolumeIndex(AudioSystem::stream_type stream, int index) 
  3. getStreamVolumeIndex(AudioSystem::stream_type stream)
复制代码

       由此可见,电话铃声可以有7个级别的音量,而音乐则可以有15个音量级别,java的代码通过jni,最后调用 AudioPolicyManager的initStreamVolume(),把这个数组的内容传入AudioPolicyManager中,这样 AudioPolicyManager也就记住了每一个音频流的音量级别。应用程序可以调用setStreamVolumeIndex设置各个音频流的音量级别,setStreamVolumeIndex会把这个整数的音量级别转化为适合人耳的对数级别,然后通过AudioPolicyService的 AudioCommandThread,最终会将设置应用到AudioFlinger的相应的Track中。

android – devicePolicyManager.lockNow()不适用于Motorola Tablets

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 – NestedScrollView在与CollapsingToolbarLayout一起使用时不会滚动到结尾

我想将nestedScrollView与CollapsingToolbarLayout一起使用.在nestedScrollView中,内容确实很长.不幸的是我无法滚动到最后.一些长期内容被削减.当我转动屏幕,滚动工作正常并且所有内容都可见时,有什么奇怪的.
<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不会滚动到结尾.

在nestedScrollView之后放置AppBarLayout为我做了诀窍.如果它适合你,请告诉我.

关于Logback-Android:将FixedWindowRollingPolicy与SizeBasedTriggeringPolicy一起使用时出现“无适用操作”错误的介绍已经告一段落,感谢您的耐心阅读,如果想了解更多关于Android AudioPolicyService 和 AudioPolicyManager、Android AudioPolicyService和AudioPolicyManager、android – devicePolicyManager.lockNow()不适用于Motorola Tablets、android – NestedScrollView在与CollapsingToolbarLayout一起使用时不会滚动到结尾的相关信息,请在本站寻找。

本文标签: