当前位置:编程学习 > wap >>

如何在Android端判断是否是开发状态,即Eclipse打开链接Android模拟器或真机

Eclipse 开发时, 可能是在模拟器上运行,也可能是在真机上运行。
可能是调试状态,也可能是运行状态。


我想在我代码中如果发现是开发状态,有异常发生时,直接扔出,如果不是开发状态,则记录到一个文件。

Debug.isDebuggerConnected() 函数返回的是是否是调试状态。 开发时运行状态会认为不是调试状态。

android.os.Build.MODEL 能区分是真机还是模拟器, 但是不能区分是开发还是非开发状态。

我该用哪个来判断是开发还是非开发运行状态。


也就是是否有usb调试数据线连接到Android设备了。
--------------------编程问答-------------------- 我也遇到了同样的问题,不知道楼主解决没,有没有什么办法? --------------------编程问答--------------------
引用 楼主 ghj1976 的回复:
Eclipse 开发时, 可能是在模拟器上运行,也可能是在真机上运行。
可能是调试状态,也可能是运行状态。


我想在我代码中如果发现是开发状态,有异常发生时,直接扔出,如果不是开发状态,则记录到一个文件。

Debug.isDebuggerConnected() 函数返回的是是否是调试状态。 开发时运行状态会认为不是调试状态。

android.os.Build.MODEL 能区……


当android设备连接到USB时,会发送android.hardware.usb.action.USB_STATE
Lz 可以在AnroidManiFest.xml中声明如下   接受该广播
        <receiver android:name=".UsbReceiver">
            <intent-filter>
                <action android:name="android.hardware.usb.action.USB_STATE"/>
            </intent-filter>
            <intent-filter>
                <action android:name="android.intent.action.MEDIA_MOUNTED"/>
                <data android:scheme="file"/>
            </intent-filter>
        </receiver>

在增加UsbReceiver.java文件
对接受到的广播做处理

public class UsbReceiver extends BroadcastReceiver {
    private static final String TAG = "UsbReceiver";
    private static final String ASK_ON_PLUG = "ask_on_plug";
    private static final String sInecm = SystemProperties.get(TelephonyProperties.PROPERTY_INECM_MODE, "false");
    private StorageManager mStorageManager = null;
    private UsbManager mUsbManager;
    private static boolean mMeidaMountStatus;
    private SharedPreferences mSharedPre;
    private SharedPreferences.Editor mEeditor;
    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        mStorageManager = (StorageManager) context.getSystemService(Context.STORAGE_SERVICE);
        mUsbManager = (UsbManager)context.getSystemService(Context.USB_SERVICE);
        mSharedPre = context.getSharedPreferences("com.android.settings_preferences", 0);
        mEeditor = mSharedPre.edit();
        if (UsbManager.ACTION_USB_STATE.equals(action) ){
            onUsbStateReceive(context, intent);
        } else if (Intent.ACTION_MEDIA_MOUNTED.equals(action)) {
            onMediaMountedReceive(context, intent);
        }
    }

    private void onMediaMountedReceive(Context context, Intent intent) {
        boolean usb_connected = mSharedPre.getBoolean("usbState", false);
        
        if(usb_connected && context.getResources().getBoolean(R.bool.usb_mass_storage_mode_enable)
            && UsbManager.USB_FUNCTION_MASS_STORAGE.equals(mUsbManager.getDefaultFunction())) {
            popUsbDialog(context);
        } else {
            return;//do nothing
        }
    }
    
    private void popUsbDialog(Context context) {
     boolean usb_connected = mSharedPre.getBoolean("usbState", false);
     String sdcardState = Environment.getSDCardStorageState();
        if (usb_connected
         && (sdcardState.equals(Environment.MEDIA_MOUNTED) || sdcardState.equals(Environment.MEDIA_MOUNTED_READ_ONLY))
                && UsbManager.USB_FUNCTION_MASS_STORAGE.equals(mUsbManager.getDefaultFunction())
                && !mStorageManager.isUsbMassStorageEnabled()
                && (Settings.Secure.getInt(context.getContentResolver(), Settings.Secure.DEVICE_PROVISIONED, 0) == 1)
                && context.getResources().getBoolean(R.bool.usb_mass_storage_mode_enable) ) {
            Intent i = new Intent();
            i.setClassName(context, "com.android.settings.MassStorageDialogActivity");
            i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            context.startActivity(i);
        }
    }
    
    private void onUsbStateReceive(Context context, Intent intent) {
        boolean usb_connected = intent.getBooleanExtra(UsbManager.USB_CONFIGURED, false);
        final ContentResolver cr = context.getContentResolver();
        mEeditor.putBoolean("usbState", usb_connected);
        mEeditor.commit();

        boolean changed = false;
        boolean preState = mSharedPre.getBoolean("preState", false);
        String progress = SystemProperties.get("vold.encrypt_progress");
        if ((progress != null) && !progress.isEmpty())  {
            return;
        }
        if (usb_connected != preState) {
            changed = true;
        }
        KeyguardManager kgm =
            (KeyguardManager) context.getSystemService(Context.KEYGUARD_SERVICE);
        if (sInecm.equals("false")
                && usb_connected && changed && !preState
                && (1 == Settings.System.getInt(cr, UsbReceiver.ASK_ON_PLUG, 1))
                && !kgm.inKeyguardRestrictedInputMode()) {
            mEeditor.putBoolean("preState", true);
            mEeditor.commit();
            //注意这里,我这里处理的方式是当USB连接上了android设备,我就跳转到设置的UsbSettings界面,LZ可以参考我的代码自己来修改           
            context.startActivity(Intent.makeRestartActivityTask(
               new ComponentName("com.android.settings","com.android.settings.UsbSettings")));
        } else if (!usb_connected) {
            mEeditor.putBoolean("preState", false);
            mEeditor.commit();
        }
        String usbType = SystemProperties.get("persist.sys.usb.config", "");
        if (usbType != null) {
            UsbSettings.writeSuitestate(mUsbManager.getDefaultFunction());
        }
              
        if (UsbManager.USB_FUNCTION_MASS_STORAGE.equals(mUsbManager.getDefaultFunction())
            && context.getResources().getBoolean(R.bool.usb_mass_storage_mode_enable)) {
            if (usb_connected){
                popUsbDialog(context);
            } else {
             if (mStorageManager.isUsbMassStorageEnabled()) {
             mStorageManager.disableUsbMassStorage();
             }
            }
        }
    }
}

--------------------编程问答--------------------
if(BuildConfig.DEBUG)

难道是说这句? --------------------编程问答--------------------
引用 2 楼 ConnectionUtils 的回复:
引用 楼主 ghj1976 的回复:Eclipse 开发时, 可能是在模拟器上运行,也可能是在真机上运行。
可能是调试状态,也可能是运行状态。


我想在我代码中如果发现是开发状态,有异常发生时,直接扔出,如果不是开发状态,则记录到一个文件。

Debug.isDebuggerConnected() 函数返回的是是否是调试状态。 开发时运行状态会认为不是调试状……


这个挺好,但是会有个问题,如果我一开始就是链接USB(默认开发模式运行),无法接受到广播的 ? --------------------编程问答--------------------
引用 2 楼 ConnectionUtils 的回复:
引用 楼主 ghj1976 的回复:Eclipse 开发时, 可能是在模拟器上运行,也可能是在真机上运行。
可能是调试状态,也可能是运行状态。


我想在我代码中如果发现是开发状态,有异常发生时,直接扔出,如果不是开发状态,则记录到一个文件。

Debug.isDebuggerConnected() 函数返回的是是否是调试状态。 开发时运行状态会认为不是调试状……


这个挺好,但是会有个问题,如果我一开始就是链接USB(默认开发模式运行),无法接受到广播的 ?  --------------------编程问答-------------------- ...不管插拔 USB数据线  都会发送android.hardware.usb.action.USB_STATE广播的

如果你的应用  是预置到android 设备上的话  肯定是能接受到的 --------------------编程问答--------------------
引用 6 楼 ConnectionUtils 的回复:
...不管插拔 USB数据线  都会发送android.hardware.usb.action.USB_STATE广播的

如果你的应用  是预置到android 设备上的话  肯定是能接受到的


你好,我是开发模式,应用是我在Debug或者Run的时候安装的,这样是有问题啊 --------------------编程问答--------------------
引用 7 楼 ice_lut 的回复:
Quote: 引用 6 楼 ConnectionUtils 的回复:

...不管插拔 USB数据线  都会发送android.hardware.usb.action.USB_STATE广播的

如果你的应用  是预置到android 设备上的话  肯定是能接受到的


你好,我是开发模式,应用是我在Debug或者Run的时候安装的,这样是有问题啊



如果不是事先预置安装的应用   确实会有问题     对于上叙提到的问题  暂时没有想到什么号的办法了~~

先帮你顶贴    看其他人的想法是怎么个样子的
补充:移动开发 ,  Android
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,