android中对u盘以及tf卡插入的广播监听

本文介绍了一个用于监听USB状态变化的BroadcastReceiver实现,并详细解释了如何根据USB连接状态启动或切换到特定应用的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

public class UsbStateReceiver extends BroadcastReceiver {   //BroadcastReceiver
    private String TAG = "UsbStateReceiver";
    public static final int USB_STATE_ON = 0x00021;
    public static final int USB_STATE_OFF = 0x00022;

    private static final int GET_RUNNING_TASKS_NUM = 30;
    private static final String PACKAGE_NAME = "com.memo.filemanager";

    private static Handler mHandler;
    public static Handler getHandler() {
        return mHandler;
    }

    public static void setHandler(Handler handler) {
        mHandler = handler;
    }

    private static int number = 0;

    @Override
    public void onReceive(final Context context, Intent intent) {
        if ( number++ == 0) {
            return;
        }

        Message msg = new Message();

        String action = intent.getAction();
        if (action.equals(Intent.ACTION_MEDIA_EJECT)) {
            //USB设备移除,更新UI
            Log.d( TAG, "USB:ACTION_MEDIA_EJECT");
            msg.what = USB_STATE_OFF;

        } else if (action.equals(Intent.ACTION_MEDIA_MOUNTED)) {
            //USB设备挂载,更新UI
            Log.d( TAG, "USB:ACTION_MEDIA_MOUNTED");
            msg.what = USB_STATE_ON;

            ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
            RunningTaskInfo taskinfo = am.getRunningTasks(1).get(0);    // 获取到当前正在栈顶运行的Activity。
            String packname = taskinfo.topActivity.getPackageName();    // 获取到当前任务栈顶程序所对应的包名。
            if( !packname.equals(PACKAGE_NAME) ) {
                /*
                final MyDialog confirmDialog = new MyDialog(context, "使用文件管理器打开U盘?", "确定", "取消");
                confirmDialog.setClicklistener(new MyDialog.ClickListenerInterface() {
                    @Override
                    public void doConfirm() {
                        confirmDialog.dismiss();
                        Intent i = new Intent(context, MainActivity.class);
                        i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                        i.putExtra("Selected", "Removable Disk");
                        context.startActivity(i);
                    }

                    @Override
                    public void doCancel() {
                        confirmDialog.dismiss();
                    }
                });
                confirmDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
                confirmDialog.show();
                */
                Intent i = new Intent(context, MainActivity.class);
                if( isRunningTask(context)) {
                    i.addFlags(Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT);
                } else {
                    i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                }
                i.putExtra("Selected", "Removable Disk");
                context.startActivity(i);

            }
        }

        if( mHandler != null ) {
            mHandler.sendMessage(msg);
        }
    }

    public boolean isRunningTask(Context context){
        ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
        List<RunningTaskInfo> tasks=  am.getRunningTasks(GET_RUNNING_TASKS_NUM);
        Iterator<RunningTaskInfo> itInfo = tasks.iterator();
        while( itInfo.hasNext() ){
            RunningTaskInfo info = itInfo.next();
            String packname = info.baseActivity.getPackageName();
            if( packname.equals(PACKAGE_NAME) ) {
                return true;
            }
        }
        return false;
    }

    public boolean isRunningProcess( Context context ) {
        PackageManager pm = context.getPackageManager();
        ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
        List<RunningAppProcessInfo> appProcessList = am.getRunningAppProcesses();
        ApplicationInfo appInfo = null;
        for (RunningAppProcessInfo appProcessInfo : appProcessList) {
            try {
                appInfo = pm.getApplicationInfo(appProcessInfo.processName, 0);
            } catch (PackageManager.NameNotFoundException e) {
                e.printStackTrace();
            }
            if(appInfo.packageName.equals(PACKAGE_NAME)) {
                return true;
            }
        }
        return false;
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值