android摄像头预览取景画面监听Home键长按短按触发事件

2015年03月10日 Android 暂无评论 阅读3617次

android摄像头预览取景画面监听Home键长按短按触发事件

android开发涉及到自己调用手机设备的摄像头硬件来做应用时,我经常遇到的一个问题就是在摄像头正正常预览显示着时,用户突然做了一个Home键长按或短按的操作,此时如果再次通过最近打开运行的任务来进入到此画面,则摄像头就会出现死掉、黑屏或绿屏等一系列异常问题。

对策上述问题,我们需要监听手机的Home键按下事件并对此做相应的回避处理。
网上有前辈云:
Back键的监听比较容易,可以在多个系统回调处拦截
对于Home键的监听不是那么容易,因为Home键可以将程序退出放在后台,所以这个事件是直接分发给系统,系统接收到之后做相应处理,Home键的事件不是直接传递到应用里面.所以在上述监听Back键的代码中,相应的回调中是收不到Home键的事件的.
基于上述解释,我们可以做一个类似看门狗似的HomeWatcher类来接收Home键事件并添加自己的逻辑处理。


package net.jileniao.android.event.util;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.util.Log;

/**
 * Home键监听封装
 * 
 */
public class HomeWatcher {

    private final String TAG = "HomeWatcher";
    private Context mContext;
    private IntentFilter mFilter;
    private OnHomePressedListener mListener;
    private HomeKeyRecevier mRecevier;

    // 回调接口
    public interface OnHomePressedListener {
        public void onHomePressed();

        public void onHomeLongPressed();
    }

    public HomeWatcher(Context context) {
        mContext = context;
        mFilter = new IntentFilter(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);
    }

    /**
     * 设置监听
     * 
     * @param listener
     */
    public void setOnHomePressedListener(OnHomePressedListener listener) {
        mListener = listener;
        mRecevier = new HomeKeyRecevier();
    }

    /**
     * 开始监听,注册广播
     */
    public void startWatch() {
        if (mRecevier != null) {
            mContext.registerReceiver(mRecevier, mFilter);
        }
    }

    /**
     * 停止监听,注销广播
     */
    public void stopWatch() {
        if (mRecevier != null) {
            mContext.unregisterReceiver(mRecevier);
        }
    }

    /**
     * 广播接收者
     */
    class HomeKeyRecevier extends BroadcastReceiver {
        final String SYSTEM_DIALOG_REASON_KEY = "reason";
        final String SYSTEM_DIALOG_REASON_GLOBAL_ACTIONS = "globalactions";
        final String SYSTEM_DIALOG_REASON_RECENT_APPS = "recentapps";
        final String SYSTEM_DIALOG_REASON_HOME_KEY = "homekey";

        @Override
        public void onReceive(Context context, Intent intent) {
            String action = intent.getAction();
            if (action.equals(Intent.ACTION_CLOSE_SYSTEM_DIALOGS)) {
                String reason = intent.getStringExtra(SYSTEM_DIALOG_REASON_KEY);
                if (reason != null) {
                    Log.i(TAG, "action:" + action + ",reason:" + reason);
                    if (mListener != null) {
                        if (reason.equals(SYSTEM_DIALOG_REASON_HOME_KEY)) {
                            // 短按home键
                            mListener.onHomePressed();
                        } else if (reason
                                .equals(SYSTEM_DIALOG_REASON_RECENT_APPS)) {
                            // 长按home键
                            mListener.onHomeLongPressed();
                        }
                    }
                }
            }
        }
    }
}

需要监听的地方,一般是在放在APP类的onCreate()方法或MainActivity类的onCreate()方法中,当然也可以根据自己的需求只针对某个Activity做监听。在自己需要监听Home键的地方添加如下代码


HomeWatcher mHomeWatcher = new HomeWatcher(this);
        mHomeWatcher.setOnHomePressedListener(new OnHomePressedListener() {
            @Override
            public void onHomePressed() {
                PreviewBeautyActivity.this.finish();
            }

            @Override
            public void onHomeLongPressed() {
                PreviewBeautyActivity.this.finish();
            }
        });
        mHomeWatcher.startWatch();


最后取消监听的地方一般写在onPause()中




@Override
    protected void onPause() {
        mHomeWatcher.stopWatch();
        super.onPause();
}




分享本文至:

WRITTEN BY

avatar
本文标签:home
看了本文是不是觉得很赞,那就赶紧点击下面按钮分享给身边的朋友吧!

欢迎留言




用户登录

sitemap