android 检测空闲状态有没有提供检测USB状态和路径的方法

> 【Android取证-4】USB调试模式
【Android取证-4】USB调试模式
文前提示:本文与小i微课堂有部分内容重复。熟悉USB调试相关知识的朋友可以略过 1.什么是USB调试模式? 「USB 调试」又称为USB Debug,是 Android 为开发者提供的一个用于开发工作的功能,开发者可通过该功能实现在计算机和移动设备之间复制数据、安装应用程
文前提示:本文与小i微课堂有部分内容重复。熟悉USB调试相关知识的朋友可以略过
1.什么是&USB调试&模式?
「USB 调试」又称为USB Debug,是 Android 为开发者提供的一个用于开发工作的功能,开发者可通过该功能实现在计算机和移动设备之间复制数据、安装应用程序与读取日志数据等功能。在手机取证工作中,USB调试模式打开是进行逻辑获取的先决条件。USB调试模式未打开会很大程度上影响手机数据提取难度。因为只有打开了「USB 调试」模式,计算机才能与您的移动设备建立有线连接,否则一切都是无用功。而且默认情况下,「USB 调试」是关闭的。
2.怎么打开「USB 调试」模式?
& 由于Android目前有多个版本系统,打开USB调试模式的方法略有区别,但4.2版本以前的系统打开USB调试模式都不复杂:
Android3.2及以前版本
在应用程序列表选择「设置」进入系统设置菜单
选择「应用程序」选项
选择「开发」选项
选择「USB 调试」选项并且确认
Android4.0和4.1
在应用程序列表选择「设置」进入系统设置菜单
选择「开发者选项」
在顶部打开「开发者选项」开关
勾选「USB 调试」选项并且确认
Android4.2及更高版本
当手机升级到Android 4.2 系统,发现「USB调试开关」默认是关闭,可以按照以下步骤进行打开。
找到「设置」图标,进入~
点击「关于手机」
拉到屏幕最下方,找到「版本号」,猛击5-7下
猛击过后,如果出现下图中「您现在处于开发者模式」,说明您猛击成功;如果没有,请继续猛击,直至出现为止。
再回到「设置」页面,您就可以找到「{}开发者选项」了!
进入「开发者选项」,点击「USB 调试」选项
于是弹出了一个小窗口,请点击「确定」
退回「开发者选项」,确认「USB 调试」是勾选状态。
USB调试开启特例
如果您使用 MIUI 4.0 系统,请按照以下步骤操作:
STEP1:在桌面点击「设置」,进入系统设置列表;
STEP2:选择「全部设置」标签,进入「开发人员选项」;
STEP3:勾选「USB调试」并在弹出页面选择「确定」。
如何确认USB调试已经真正打开?
有时候,在手机上&USB调试&虽然显示是勾选状态,但有可能是假象,这时候,可以先取消勾选,再进行勾选,重新激活&USB调试&开关的打开状态。
在连接到电脑上后,通过查看设备管理器中的设备,可以检查&USB调试&是否已真正打开。即,打开设备管理器(右键单击&我的电脑/计算机&,选择&管理&&&&设备管理器&),是否能够看到您的设备呢(在&Adb Interface&,或者&Android Phone&目录下,一般都显示在第一位)?如果能够看到,说明您的USB调试已经打开并且电脑识别到了您的设备,如果看不到您的设备,说明没有成功打开USB调试,或者您的硬件连接出现了问题。
如果您的手机USB调试正确打开,可以通过豌豆荚等软件给手机自动安装驱动程序,如下面三张图所示,均是成功安装驱动的设备显示:
如果没有成功安装驱动,则会出现一些打了问号或是感叹号的设备,如下图:
对于Android系统而言,USB调试模式是否打开实际上是通过系统中的配置文件实现。已Android4.1版本为例:USB调试模式配置文件是:persist.sys.usb.config,
& & & &该文件保存路径为:data/property/
& & & &persist.sys.usb.config文件可以通过记事本方式打开,内容如下图:
其中&,adb&表示打开USB调试模式,这意味着如果手机未开通USB调试模式时,在某些特定条件下,可以通过对该配置文件进行编辑(添加&,adb&)来强制打开USB调试模式。
& & & &未开启USB调试模式获取数据的方法由于相对比较复杂,另行进行介绍。
------分隔线----------------------------
Copyright &[Android]联通性 -- USB主机模式
当你的设备在USB主机模式中时,它作为USB主机给从属设备供电,并会列举被连接的USB设备。USB主机模式在Android3.1以后开始被支持。
一,API概要
&&&&&&& 在开始之前,重要的是要理解工作中所需要的类。下表介绍了在android.hardware.usb包中的USB主机模式API。&
&&&&&&& 表1&&& USB主机模式API
UsbManager
&用于列举被连接的USB设备,并跟其通信。
&代表了一个被连接的USB设备,并且包含了访问它的识别信息、接口、和端点的方法。
UsbInterface
&代表了一个USB设备的接口,该接口定义了设备的一组功能。一个设备可以有一个或多个用于通信的接口。
UsbEndpoint
&代表一个接口端点,它是跟接口通信的通道。一个接口可以有一个或多个端点,通常会有跟设备进行双工通信的输入和输出端点。
UsbDeviceConnection
&代表一个设备连接,它在端点之上传输数据。这个类用于在连接的两个设备间使用同步或异步的方式来回发送数据。
UsbRequest
&代表一个通过UsbDeviceConnection对象跟设备通信的异步请求。
UsbConstants
&定义了跟内核中linux/usb/ch9.h文件定义对应的USB常量。
&&&&&&& 在大多数情况中,跟USB设备通信时,需要使用所有这些类(如果你是在使用异步通信,那么只需要使用UsbRequest类)。通常,要使用UsbManager对象来获取期望的UsbDevice对象。当你有了这个UsbDevice对象时,就需要查找对应的UsbInterface对象和基于该接口通信的UsbEndpoint对象。一旦获取了正确的端点,就可以打开UsbDeviceConnect对象来跟USB设备进行通信了。
二,Android清单要求
&&&&&&& 在使用USB主机模式API工作之前,你需要把以下介绍的内容添加到你的应用程序清单中:
&&&&&&& 1.&& 因为不是所有的Android设备都保证支持USB主机模式,所以要在你的应用程序声明中包含&uses-feature&元素,以声明你的应用程序要使用android.hardware.usb.host功能。
&&&&&&& 2.&& 把应用程序的最小SDK设置为API Level 12或更高的版本。在较早的API版本中不存在USB主机模式API。
&&&&&&& 3.&& 如果你希望你的应用程序能够获得接入USB设备时的通知,那么还要在你的主Activity中指定用android.hardware.usb.action.USB_DEVICE_ATTACHED类型的Intent来配对的&intent-filter&和&meta-data&元素。&meta-data&元素要指向一个外部的XML资源文件,该文件声明了希望检测的设备的识别信息(对方设备发过来的信息)。
&&&&&&& 在这个XML资源文件中,要用&usb-device&元素来声明你想要过滤的USB设备。以下列出了&usb-device&元素的属性。通常,使用vendor-id和product-id来指定你所希望过滤的特定的设备,并且使用class、subclass和protocol来指定你所希望过滤的USB设备组,如大容量存储设备或数码相机。你可以不指定任何属性,或所有全部属性。不指定任何属性,就会跟所有USB设备匹配,如果应用程序需要,就可以这样做:
A. vendor-id
B. product-id
D. subclass
E.& protocol(设备或接口)
在res/xml目录中保存这个资源文件。该资源文件的名称(不含.xml扩展名)必须跟&meta-data&元素中指定的名称相同。XML资源文件的格式请看下例。
三,清单和资源文件的示例
以下是一个简单的清单文件和它所对应的资源文件:
&manifest ...&
&& &uses-feature android:name=&android.hardware.usb.host& /&
&& &uses-sdk android:minSdkVersion=&12& /&
&& &application&
&&&&&& &activity ...&
&&&&&&&&&& ...
&&&&&&&&&& &intent-filter&
&&&&&&&&&&&&&& &action android:name=&android.hardware.usb.action.USB_DEVICE_ATTACHED& /&
&&&&&&&&&& &/intent-filter&
&&&&&&&&&& &meta-data android:name=&android.hardware.usb.action.USB_DEVICE_ATTACHED&
&&&&&&&&&&&&&& android:resource=&@xml/device_filter& /&
&&&&&& &/activity&
&& &/application&
&/manifest&
在这个实例中,下面的资源文件应该被保存在res/xml/device_filter.xml中,并且指定了所有的用于过滤USB设备的属性:
&?xml version=&1.0& encoding=&utf-8&?&
&resources&
&& &usb-device vendor-id=&1234& product-id=&5678& class=&255& subclass=&66& protocol=&1& /&
&/resources&
四,跟设备一起工作
&&&&&&& 当用户把USB设备接入到Android设备上时,Android能够判断你的应用程序是否对接入的设备感兴趣。如果是你的应用程序感兴趣的设备,你就可以跟你期望的设备建立通信。以下是你的应用程序必须要做的工作:
&&&& 1. 使用以下两种方法之一来发现接入的UDB设备:
&&&&&&&&&&&&& A. 使用Intent过滤器,过滤用户接入USB设备时所发出的通知;
&&&&&&&&&&&&& B. 列举已经接入的USB设备。
&&&& 2. 如果没获取接入USB设备的权限,会向用户请求接入USB设备的权限。
&&&& 3. 通过读写对应接口端点上的数据来跟USB设备通信。
五,发现设备
&&&&&&& 用户既可以通过使用
&&&&&&&&&&&&& 1.用户接入USB设备时所发出Intent过滤通知
&&&&&&&&&&&&& 2.也可以通过列举已经接入的USB设备
&&&&&&& 来发现USB设备。
&&&&&&& 如果你希望你的应用程序能够自动的检测到你所期望的USB设备,那么要使用Intent过滤器。
&&&&&&& 如果你想要过的接入的所有的已经接入的设备列表,或者是你的应用程序没有过滤对应的Intent对象,那么要使用列举的方法。
六,使用Intent过滤器
&&&&&&&& 为了让你的应用程序发现一个特殊的USB设备,你可以指定一个android.hardware.usb.action.USB_DEVICE_ATTACHED类型的Intent过滤器。跟这个Intent过滤器一起,你还需要指定一个指定了USB设备属性的资源文件,如果产品和供应商ID。当用户接入的设备跟你的设备过滤器匹配的时候,系统会显示一个对话框,询问你是否允许它们启动你的应用程序。如果用户接收,应用程序会自动的被授予访问设备的权限,一直到设备断开连接。
以下示例演示了如何声明Intent过滤器:
&activity ...&
&& &intent-filter&
&&&&&& &action android:name=&android.hardware.usb.action.USB_DEVICE_ATTACHED& /&
&& &/intent-filter&
&& &meta-data android:name=&android.hardware.usb.action.USB_DEVICE_ATTACHED&
&&&&&& android:resource=&@xml/device_filter& /&
&/activity&
以下示例演示了如何声明对应的你感兴趣的USB设备的资源文件:
&?xml version=&1.0& encoding=&utf-8&?&
&resources&
&& &usb-device vendor-id=&1234& product-id=&5678& /&
&/resources&
在你的Activity中,按照如下的方法,你可以从Intent对象中获得一个代表接入的设备的UsbDevice对象:
UsbDevice device=(UsbDevice) intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);
七,列举设备
&&&&&&& 当你的应用程序要在运行时检测当前接入的所有的USB设备时,它可以列举总线上的设备。使用getDeviceList()方法来获取已经接入的所有的USB设备的hash map。该hash map使用USB设备的名称做key:
UsbManager manager = (UsbManager) getSystemService(Context.USB_SERVICE);
HashMap&String, UsbDevice& deviceList = manager.getDeviceList();
UsbDevice device = deviceList.get(&deviceName&);
如果你愿意,也可以使用hash map的迭代器来处理每个设备:
UsbManager manager = (UsbManager) getSystemService(Context.USB_SERVICE);
HashMap&String, UsbDevice& deviceList = manager.getDeviceList();
Iterator&UsbDevice& deviceIterator = deviceList.values().iterator();
while(deviceIterator.hasNext()){
&& UsbDevice device = deviceIterator.next()
&& //your code
八,获取跟设备通信的权限
&&&&&&&& 在跟USB设备进行通信之前,你的应用程序必须要获取用户的许可。
&&&&&& 注意:如果你的应用程序使用Intent过滤器来发现接入的USB设备,而且用户允许你的应用程序处理该Intent,那么它会自动的接收权限,否则,在你的应用程序接入该设备之前,必须明确的申请权限。
&&&&&&&& 明确的申请权限在某些情况下是必须的,如你的应用程序列举已经接入的USB设备并想要跟其中的一个设备通信的时候。在试图跟一个设备通信之前,你必须要检查是否有访问设备的权限。否则,如果用户拒绝了你访问该设备的请求,你会收到一个运行时错误。
&&&&&&&& 要明确的获取这个权限,首先要创建一个广播接收器。这个接收器用于监听你调用requestPermission()方法时,系统所发出的Intent对象。调用requestPermission()方法时,系统会显示一个对话框,询问用户是否允许跟该USB设备进行连接。下列代码演示如何创建这个广播接收器:
private static final String ACTION_USB_PERMISSION =
&& &com.android.example.USB_PERMISSION&;
private final BroadcastReceiver mUsbReceiver = new BroadcastReceiver() {
&& public void onReceive(Context context, Intent intent) {
&&&&&& String action = intent.getAction();
&&&&&& if (ACTION_USB_PERMISSION.equals(action)) {
&&&&&&&&&& synchronized (this) {
&&&&&&&&&&&&&& UsbDevice device = (UsbDevice)intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);
&&&&&&&&&&&&&& if (intent.getBooleanExtra(UsbManager.EXTRA_PERMISSION_GRANTED, false)) {
&&&&&&&&&&&&&&&&&& if(device != null){
&&&&&&&&&&&&&&&&&&&& //call method to set up device communication
&&&&&&&&&&&&&&&&& }
&&&&&&&&&&&&&& }
&&&&&&&&&&&&&& else {
&&&&&&&&&&&&&&&&&& Log.d(TAG, &permission denied for device & + device);
&&&&&&&&&&&&&& }
&&&&&&&&&& }
在你的Activity中的onCreate()方法中添加注册该广播接收器的代码:
UsbManager mUsbManager = (UsbManager) getSystemService(Context.USB_SERVICE);
private static final String ACTION_USB_PERMISSION =
&& &com.android.example.USB_PERMISSION&;
mPermissionIntent = PendingIntent.getBroadcast(this, 0, new Intent(ACTION_USB_PERMISSION), 0);
IntentFilter filter = new IntentFilter(ACTION_USB_PERMISSION);
registerReceiver(mUsbReceiver, filter);
调用requestPermission()方法,显示申请接入设备的权限的对话框:
mUsbManager.requestPermission(device, mPermissionIntent);
&&&&&&& 当用户应答了该对话框时,你的广播接收器就会收到一个包含EXTRA_PERMISSINO_GRANTED类型附加字段的Intent对象,该字段用一个布尔值来代表回答结果。在连接该设备之前,要检查这个字段的值是否是true。
九,跟设备进行通信
&&&&&&&& 跟USB设备的通信既可以是异步的,也可以是同步的。在异步的情况下,你应该创建一个线程来执行所有的数据传输,以便不至于阻塞UI线程。要正确的建立跟设备的通信,你需要获得准备与其通信的设备所对应的UsbInterface和UsbEndpoint对象,并且使用UsbDeviceConnection对象把请求发送给这个端点。通常步骤如下:
&&&&&&&&& 1.&&&&&& 检查UsbDevice对象的属性,如产品ID、供应商ID、或者设备的分类,判断该设备是否是你所想要的设备;
&&&&&&&&& 2.&&&&&& 当你确认它是你想要与其通信的设备时,就要找到该设备对应的UsbInterface对象以及跟该接口对象一起的UsbEndpoint对象。接口可以有一个或多个端点,通常会有用于双工通信的输入和输出端点;
&&&&&&&&& 3.&&&&&& 当你找正确的端点时,就可以打开一个该端点上的UsbDeviceConnection对象;
&&&&&&&&& 4.&&&&&& 使用bulkTransfer()或controlTransfer()方法,把你想要传输的数据提供给端点。你应该在另外一个线程中执行本步骤的操作,以便防止阻塞主UI线程。
&&&&&&&&& 以下代码片段是一个普通的同步传输数据的方法。你的代码应该有更多的逻辑用于查找用来通信的正确的接口和端点,并且还应该在一个不同于主UI线程的线程中来进行数据传输:
private Byte[] bytes
private static int TIMEOUT = 0;
private boolean forceClaim =
UsbInterface intf = device.getInterface(0);
UsbEndpoint endpoint = intf.getEndpoint(0);
UsbDeviceConnection connection = mUsbManager.openDevice(device);
connection.claimInterface(intf, forceClaim);
connection.bulkTransfer(endpoint, bytes, bytes.length, TIMEOUT); //do in another thread
要异步的发送数据,就要使用UsbRequest类来进行初始化,并发送一个异步请求,让后用requestWait()方法等待结果。
更多的信息请看Adb test sample,它显示了怎样进行异步块数据数据传输,MissleLauncher sample显示了如何监听异步的中断端点。
十,中断跟设备的通信
&&&&&&&& 在你完成跟设备的通信,或者设备被分离时,就要调用releaseInterface()方法和close()方法来关闭UsbInterface和UsbDeviceConnection对象。创建下面这样的广播接收器来监听分离事件:
BroadcastReceiver mUsbReceiver = new BroadcastReceiver() {
&& public void onReceive(Context context, Intent intent) {
&&&&&& String action = intent.getAction();
&&&& if (UsbManager.ACTION_USB_DEVICE_DETACHED.equals(action)) {
&&&&&&&&&& UsbDevice device = (UsbDevice)intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);
&&&&&&&&&& if (device != null) {
&&&&&&&&&&&&&& // call your method that cleans up and closes communication with the device
&&&&&&&&&& }
如果在应用程序中创建广播接收器,但没有在清单中注册,那么就允许你的应用程序只在运行时处理分离事件。这种情况下,分离事件只会发送给当前运行的应用程序,并且不是广播给所有的应用程序android 系统是开源的,于是各种产商各种瞎改android系统,工作了几个月,我发现单单就android的内外存储设备的路径我就不知道怎么获取了。上网查了几种方案,自己试验了下,感觉好迷茫啊。在这里记录下我试验的几种方案。
方案一:通过Enviroment类获取存储设备路径
android的官方文档上说,采用Enviroment.getExternalStorageDirectory()方法可以得到android设备的外置存储(即外插SDCARD),如果android设备有外插SDCARD的话就返回外插SDCARD的根目录路径,如果android设备没有外插SDCARD的话就返回android设备的内置SDCARD的路径。这套方案很快就被否决了,因为Enviroment类的这个方法里面的路径也是写死的,只有原生的android系统才使用这套方案,被更改过的anroid体统很多设备的路径都改了。
方案二:读取system/etc/vold.fstab文件的内容来获取存储设备路径
参考文档:
内置和外置SD卡的信息存在system/etc/vold.fstab 里面,我们可以从这里获得外置SD卡的路径。经本人实验,发现很多疑问。我的机子是三星I9300,我的机子没有外插SDCARD。通过eclipse获取vold.fstab文件,打开来看,有用的内容如下:
dev_mount sdcard /storage/extSdCard auto /devices/platform/s3c-sdhci.2/mmc_host/mmc1/
dev_mount sda /storage/UsbDriveA auto /devices/platform/s5p-ehci
dev_mount sdb /storage/UsbDriveB auto /devices/platform/s5p-ehci
dev_mount sdc /storage/UsbDriveC auto /devices/platform/s5p-ehci
dev_mount sdd /storage/UsbDriveD auto /devices/platform/s5p-ehci
dev_mount sde /storage/UsbDriveE auto /devices/platform/s5p-ehci
dev_mount sdf /storage/UsbDriveF auto /devices/platform/s5p-ehci
这里可没有我的内置SDCARD的路径啊,不懂。打开手机的文件系统发现我的内置的SDCARD路径是:/storage/emulated/0。于是我到eclipse的DDMS中去看下我的手机文件系统,发现storage路径下的文件结构为: 从这个文件结构可以看出,真正有内容的应该是emulated/legacy和sdcard0才对,再从后面的连接来看,最后这两个目录都应该是指向/mnt/shell/emulated/0。接着打开/mnt/shell/emulated/0来看看,果然是我的sdcard目录
这让我很疑惑,这样的话,读取vold.fstab文件来获取sdcard目录不就得不到/mnt/shell/emulated/0目录了么。方案二失败。
方案三:方案三的原理是linux命令,在命令窗口中输入 mount 或者 cat /proc/mounts 可得到系统挂载的存储。你也可以在DOS窗口中输入 adb shell -& mount ,或者 adb shell -& cat /proc/mounts 来查看( ”-&“ 符号只是一个分割符,不要输)。好,我来DOS窗口中输入adb shell -& mount 来看下会得到什么
这个我也看不懂,不过我猜最后一条应该是我的SDCARD的挂载了,因为有/mnt/shell/emulated 挂载路劲出现, 而/data/media是挂载的设备么?这是什么东西?好,我借部手机来看看,看其他的手机会mount出什么东西来。 那就借部note3来吧
我借来的这部手机有外插SDCARD。可以看到最后两条应该是挂载SDCARD信息了。不过它的挂载设备是/dev/fuse, 和 /dev/block/vold/179:17
。 好吧,我晕了,等等,会不会 最后两条信息才是挂载SDCARD信息呢?我的是手机因为没有外插SDCARD,所以最后一条才是挂载SDCARD信息,有外插SDCARD的,最后两条是挂载SDCARD信息。这是规律?好吧,不是规律,我又借了部手机,mount了下,发现这个猜想纯属扯淡。
利用mount命令来获取SDCARD路径的方法,
android常见的SD卡存储位置/storage/emulated/0//storage/extSdCard/mnt/external_sd//mnt/sdcard2//mnt/sdcard/external_sd//mnt/sdcard-ext//mnt/sdcard//storage/sdcard0//mnt/extSdCard//mnt/extsd//mnt/emmc//mnt/extern_sd//mnt/ext_sd//mnt/ext_card//mnt/_ExternalSD//sdcard2//sdcard//sdcard/sd//sdcard/external_sd//mnt/sd//mnt//storage//mnt/sdcard/sd//mnt/exsdcard//mnt/sdcard/extStorages/SdCard//ext_card//storage/extSdCard
3.0以上可以通过反射获取:
StorageManager sm = (StorageManager) context.getSystemService(Context.STORAGE_SERVICE);
String[] paths = (String[]) sm.getClass().getMethod("getVolumePaths", null).invoke(sm, null);
Android 4.1上
StorageManager sm = (StorageManager) context.getSystemService(Context.STORAGE_SERVICE);
String[] volumePaths = sm.getgetVolumePaths();
可以获得所有mount的SD卡,难道我要一条一条路径去遍历?就算遍历到了,我也不知道哪条是内置存储,哪条是外置存储。而且以后哪个深井冰产商又整出一条路径出来,不就没完没了了嘛。
我现在很郁闷,到底怎么弄才有一套最佳方案?跪求大神解救我。
* 获取外置SD卡路径
public static List&String& getSDCardPaths() {
List&String& sdcardPaths = new ArrayList&String&();
String cmd = "cat /proc/mounts";
Runtime run = Runtime.getRuntime();// 返回与当前 Java 应用程序相关的运行时对象
Process p = run.exec(cmd);// 启动另一个进程来执行命令
BufferedInputStream in = new BufferedInputStream(p.getInputStream());
BufferedReader inBr = new BufferedReader(new InputStreamReader(in));
String lineS
while ((lineStr = inBr.readLine()) != null) {
// 获得命令执行后在控制台的输出信息
LogUtil.i("CommonUtil:getSDCardPath", lineStr);
String[] temp = TextUtils.split(lineStr, " ");
// 得到的输出的第二个空格后面是路径
String result = temp[1];
File file = new File(result);
if (file.isDirectory() && file.canRead() && file.canWrite()) {
LogUtil.d("directory can read can write:",
file.getAbsolutePath());
// 可读可写的文件夹未必是sdcard,我的手机的sdcard下的Android/obb文件夹也可以得到
sdcardPaths.add(result);
// 检查命令是否执行失败。
if (p.waitFor() != 0 && p.exitValue() == 1) {
// p.exitValue()==0表示正常结束,1:非正常结束
LogUtil.e("CommonUtil:getSDCardPath", "命令执行失败!");
inBr.close();
in.close();
} catch (Exception e) {
LogUtil.e("CommonUtil:getSDCardPath", e.toString());
sdcardPaths.add(Environment.getExternalStorageDirectory()
.getAbsolutePath());
optimize(sdcardPaths);
for (Iterator iterator = sdcardPaths.iterator(); iterator.hasNext();) {
String string = (String) iterator.next();
Log.e("清除过后", string);
return sdcardP
private static void optimize(List&String& sdcaredPaths) {
if (sdcaredPaths.size() == 0) {
int index = 0;
while (true) {
if (index &= sdcaredPaths.size() - 1) {
String lastItem = sdcaredPaths.get(sdcaredPaths.size() - 1);
for (int i = sdcaredPaths.size() - 2; i &= 0; i--) {
if (sdcaredPaths.get(i).contains(lastItem)) {
sdcaredPaths.remove(i);
String containsItem = sdcaredPaths.get(index);
for (int i = index + 1; i & sdcaredPaths.size(); i++) {
if (sdcaredPaths.get(i).contains(containsItem)) {
sdcaredPaths.remove(i);
一定记得在manifest.xml中加权限
浏览 20559
浏览: 682474 次
所以这种情况是不使用launchMode为singleTask ...
(window.slotbydup=window.slotbydup || []).push({
id: '4773203',
container: s,
size: '200,200',
display: 'inlay-fix'

我要回帖

更多关于 android检测网络状态 的文章

 

随机推荐