Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/226.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
有没有办法通过android服务检测音量按键或音量变化?_Android_Service_Volume_Detect - Fatal编程技术网

有没有办法通过android服务检测音量按键或音量变化?

有没有办法通过android服务检测音量按键或音量变化?,android,service,volume,detect,Android,Service,Volume,Detect,一些安卓应用程序会在设备的卷发生变化时生成通知,一些应用程序会锁定卷。就我个人而言,我不知道这是怎么做到的。请,有人能帮我举个例子吗?没有检测音量变化的广播操作,但您可以每隔一秒或两秒用getStreamVolume检查音量是什么,如果您需要将其锁定在特定的音量,则每隔一秒或两秒使用:setStreamVolume 查看更多信息 您可以使用AlarmManager类或处理程序每隔一秒左右检查一次卷 如果是活动,您可以覆盖onKeyDown以检测按键。请参见实际上,通过使用Content Obse

一些安卓应用程序会在设备的卷发生变化时生成通知,一些应用程序会锁定卷。就我个人而言,我不知道这是怎么做到的。请,有人能帮我举个例子吗?

没有检测音量变化的广播操作,但您可以每隔一秒或两秒用
getStreamVolume
检查音量是什么,如果您需要将其锁定在特定的音量,则每隔一秒或两秒使用:
setStreamVolume

查看更多信息

您可以使用AlarmManager类或处理程序每隔一秒左右检查一次卷


如果是活动,您可以覆盖
onKeyDown
以检测按键。请参见

实际上,通过使用Content Observer,您可以在服务中使用一种方法。它的工作原理类似于广播接收器,可以收听更改内容的事件,如音量、联系人、通话记录

在您的服务中使用以下代码

public class VolumeService extends Service{ 
AudioManager mAudioManager;
Handler mHandler;

private ContentObserver mVolumeObserver = new ContentObserver(mHandler) {
    @Override
    public void onChange(boolean selfChange) {
        super.onChange(selfChange);
        if (mAudioManager != null) {

            final int volume = mAudioManager.getStreamVolume(AudioManager.STREAM_RING);
            System.out.println("Volume thay đổi: " +volume);

            Intent photoIntent = new Intent(VolumeService.this,TakePhotoActivity.class);
            photoIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            startActivity(photoIntent);
        }
    }
};





@Override
public void onCreate() {
    super.onCreate();

    System.out.println("Volume Service started");

    mAudioManager = (AudioManager) getSystemService(AUDIO_SERVICE);

    Uri uri = Settings.System.getUriFor(Settings.System.VOLUME_SETTINGS[AudioManager.STREAM_RING]);
    getContentResolver().registerContentObserver(uri, true, mVolumeObserver);

    System.out.println("Đã đăng ký Volume listener");
}



@Override
public void onDestroy() {
    super.onDestroy();      
    System.out.println("Volume service destroied");

    getContentResolver().unregisterContentObserver(mVolumeObserver);
}



@Override
public IBinder onBind(Intent arg0) {

    return null;
}

}
别忘了在Android Manifest.xml中声明它

<service android:name=".service.VolumeService" >

这是一种方法,您可以只修复一个设置的卷,而不是更改。我的目标是调整系统服务量

此外,避免只在需要时才这样做

public class VolumeKeyController {

    private MediaSessionCompat mMediaSession;
    private final Context mContext;

    public VolumeKeyController(Context context) {
        mContext = context;
    }

    private void createMediaSession() {
        mMediaSession = new MediaSessionCompat(mContext, KeyUtil.log);

        mMediaSession.setFlags(MediaSessionCompat.FLAG_HANDLES_MEDIA_BUTTONS |
                MediaSessionCompat.FLAG_HANDLES_TRANSPORT_CONTROLS);
        mMediaSession.setPlaybackState(new Builder()
                .setState(PlaybackStateCompat.STATE_PLAYING, 0, 0)
                .build());
        mMediaSession.setPlaybackToRemote(getVolumeProvider());
        mMediaSession.setActive(true);
    }

    private VolumeProviderCompat getVolumeProvider() {
        final AudioManager audio = mContext.getSystemService(Context.AUDIO_SERVICE);

        int STREAM_TYPE = AudioManager.STREAM_MUSIC;
        int currentVolume = audio.getStreamVolume(STREAM_TYPE);
        int maxVolume = audio.getStreamMaxVolume(STREAM_TYPE);
        final int VOLUME_UP = 1;
        final int VOLUME_DOWN = -1;

        return new VolumeProviderCompat(VolumeProviderCompat.VOLUME_CONTROL_RELATIVE, maxVolume, currentVolume) {
            @Override
            public void onAdjustVolume(int direction) {
                // Up = 1, Down = -1, Release = 0
                // Replace with your action, if you don't want to adjust system volume
                if (direction == VOLUME_UP) {
                    audio.adjustStreamVolume(STREAM_TYPE,
                            AudioManager.ADJUST_RAISE, AudioManager.FLAG_REMOVE_SOUND_AND_VIBRATE);
                }
                else if (direction == VOLUME_DOWN) {
                    audio.adjustStreamVolume(STREAM_TYPE,
                            AudioManager.ADJUST_LOWER, AudioManager.FLAG_REMOVE_SOUND_AND_VIBRATE);
                }
                setCurrentVolume(audio.getStreamVolume(STREAM_TYPE));
            }
        };
    }

    // Call when control needed, add a call to constructor if needed immediately
    public void setActive(boolean active) {
        if (mMediaSession != null) {
            mMediaSession.setActive(active);
            return;
        }
        createMediaSession();
    }

    // Call from Service's onDestroy method
    public void destroy() {
        if (mMediaSession != null) {
            mMediaSession.release();
        }
    }
}

您可以使用辅助功能服务捕获卷/硬件密钥事件


ya当手机未锁定时它工作,但当手机锁定时它不工作!!??您好,亲爱的,当手机锁定时,是否有钥匙检测选项?
设置。系统。音量设置不再可用