如果您对Android应用读写设备节点和android读写权限感兴趣,那么这篇文章一定是您不可错过的。我们将详细讲解Android应用读写设备节点的各种细节,并对android读写权限进行深入的分析,
如果您对Android 应用读写设备节点和android读写权限感兴趣,那么这篇文章一定是您不可错过的。我们将详细讲解Android 应用读写设备节点的各种细节,并对android读写权限进行深入的分析,此外还有关于Android app如何正确读写系统sys设备节点、Android Beacon Library在一台Android 4.4设备上运行良好,但在另一台Android设备上运行良好、Android File Transfer – 在 Mac 上也能读取 Android 设备文件、Android Manifest使用权限与Android设备规格的实用技巧。
本文目录一览:- Android 应用读写设备节点(android读写权限)
- Android app如何正确读写系统sys设备节点
- Android Beacon Library在一台Android 4.4设备上运行良好,但在另一台Android设备上运行良好
- Android File Transfer – 在 Mac 上也能读取 Android 设备文件
- Android Manifest使用权限与Android设备规格
Android 应用读写设备节点(android读写权限)
配置设备节点权限:
// android/device/qcom/***/init.target.rc
// 该目录下添加对应设备节点的配置
# Add /dev/sys
chmod 0660 /dev/sys
// android/device/qcom/common/rootdir/etc/uevented.qcon.rc
// 该目录下添加对应设备节点的配置
# Add /dev/sys
/dev/sys 0666 system system
// android/device/qcom/sepolicy/private/platform_app.te
// 该目录下添加对应设备节点的配置
# Add /dev/sys
allow platform_app device:chr_file { open read write ioctl };
// android/system/sepolicy/private/system_server.te
// android/system/sepolicy/prebuilts/api/28.0/private/system_server.te
// 该目录下添加对应设备节点的配置,两个目录需保持一致
#Add /dev/sys
allow system_server device:chr_file {open read write getattr };
// android/system/sepolicy/public/domain.te
// android/system/sepolicy/prebuilts/api/28.0/public/domain.te
// 该目录下添加对应设备节点的配置,两个目录需保持一致
# Don't allow raw read/write/open access to generic device.
# Rather force a relabel to a more specific type.
# 注释掉
# neverallow domain device:chr_file { open read write };
写入设备节点
final String FILE_PATH = "/sys/dev";
private void writeSysFile(){
final File file = new File(PATH_REPORT) ;
String cmd = "1";
FileOutputStream fos = null;
try{
fos = new FileOutputStream(file);
fos.write(cmd.getBytes());
fos.flush();
fos.close();
} catch (FileNotFoundException e) {
e.printstacktrace();
} catch (IOException e) {
e.printstacktrace();
} finally {
if (fos != null){
try {
fos.close();
}catch (IOException e){
e.printstacktrace();
}
}
}
}
Android app如何正确读写系统sys设备节点
http://www.jianshu.com/p/9da8cdb4e684
http://blog.csdn.net/wh_19910525/article/details/45170755
http://blog.csdn.net/lei1217/article/details/48377009
[Description]
Android L APP 如何获取sys file system 中节点的写权限
[Keyword]
L SELinux sys write
[Android Version]
Version >= android 5.0
[Solution]
Google 默认禁止app , 包括system app, radio app 等直接写/sys 下面的文件, 认为这个是有安全风险的。如果直接放开SELinux 权限, 会导致CTS 无法通过.
通常遇到此类情况,你有两种做法:
(1). 通过system server service 或者 init 启动的service 读写, 然后app 通过binder/socket 等方式连接APP 访问. 此类安全可靠, 并且可以在service 中做相关的安全审查, 推崇这种方法.
(2). 修改对应节点的SELinux Security Label, 为特定的APP, 如system app, radio, bluetooth 等内置APP开启权限, 但严禁为untrsted app 开启权限. 具体的做法下面以 system app 控制/sys/class/leds/lcd-backlight/brightness 来说明.
1. 在device/mediatek/common/sepolicy/file.te 定义brightness SELinux type
type sys_lcd_brightness_file, fs_type,sysfs_type;
2. 在device/mediatek/common/sepolicy/file_contexts 绑定 brightness 对应的label, 注意对应的节点是实际节点,而不是链接.以及整个目录路径中也绝不能包含链接(无数同仁有犯这个错误,特意提醒)
/sys/devices/platform/leds-mt65xx/leds/lcd-backlight/brightness u:object_r:sys_lcd_brightness_file:s0
3. 在device/mediatek/common/sepolicy/system_app.te 中申请权限.
allow system_app sys_lcd_brightness_file:file rw_file_perms;
4. 为其它的process 申请相关的权限,如system_server, 在device/mediatek/common/sepolicy/system_server.te
allow system_server sys_lcd_brightness_file:file rw_file_perms;
原则上我们都推崇使用第一种方式处理.
Android Beacon Library在一台Android 4.4设备上运行良好,但在另一台Android设备上运行良好
有关非工作设备的详细信息.
智能手表(通用)列为蓝牙4.0功能
MTK6572芯片组
型号EC720(似乎有很多变种)
Android 4.4.2
内核:3.4.67 chendalin-Z87-HD3#1 2014年12月27日
内部版本号:H82D.SMARTWATCH.OC4.0.20141447
自定义版本:1419655453
我正在使用相同的Radius Networks标签信标测试相同的应用程序.在这个测试中,我在我的设备的近距离内有相同的4个信标.
设备1是Nexus 7(2013),我还没有更新到Android L,它运行4.4.4
Device 2是一款通用的智能手表,在MTK6572上运行android 4.4.2.规格列出有蓝牙4.0
当我使用Android Beacon Library运行我的测试应用程序时,Nexus报告信标,但智能手表没有.它似乎检测到它们,但我看到logcat中的条目如:D / BluetoothAdapter:onScanResult() – Device = E5:E0:20:CF:63:32 RSSI = -60.当BeaconParser未设置为读取正确类型的信标时,通常会显示这些消息,但在我的情况下,我很确定这不是问题,因为nexus看到的信标具有完全相同的代码.
对于2个设备看起来非常不同的日志输出,我开始怀疑手表的android构建是否因为BLE支持被禁用或者具有不完整的堆栈.我已经仔细检查了蓝牙是否打开,并且还想注意该手表具有应用程序权限管理,我为应用程序请求的所有权限设置为“始终允许”.
这里来自smartwatch的部分logcat:
02-03 19:40:40.393 2620-2620/com.mapcushion.android.mapcushionpingl D/BeaconManager﹕ This consumer is not bound. binding: com.mapcushion.android.mapcushionpingl.Scan@41c7d2c0 02-03 19:40:40.435 2620-2620/com.mapcushion.android.mapcushionpingl D/BeaconManager﹕ consumer count is Now:1 ... 02-03 19:40:40.617 2620-2620/com.mapcushion.android.mapcushionpingl I/BeaconService﹕ beaconService version 2.1 is starting up 02-03 19:40:40.638 2620-2620/com.mapcushion.android.mapcushionpingl I/CycledLeScanner﹕ This is not Android 5.0. We are using old scanning APIs 02-03 19:40:40.645 2620-2620/com.mapcushion.android.mapcushionpingl D/ModelSpecificdistanceCalculator﹕ Finding best distance calculator for 4.4.2,KOT49H,EC720,alps 02-03 19:40:40.645 2620-2620/com.mapcushion.android.mapcushionpingl D/AndroidModel﹕ score is 0 for LGE;Nexus 4;KOT49H;4.4.2 compared to alps;EC720;KOT49H;4.4.2 02-03 19:40:40.645 2620-2620/com.mapcushion.android.mapcushionpingl D/AndroidModel﹕ score is 0 for LGE;Nexus 5;LPV79;4.4.2 compared to alps;EC720;KOT49H;4.4.2 02-03 19:40:40.645 2620-2620/com.mapcushion.android.mapcushionpingl W/ModelSpecificdistanceCalculator﹕ Cannot find match for this device. Using default 02-03 19:40:40.645 2620-2620/com.mapcushion.android.mapcushionpingl D/ModelSpecificdistanceCalculator﹕ Finding best distance calculator for 4.4.2,alps 02-03 19:40:40.645 2620-2620/com.mapcushion.android.mapcushionpingl D/AndroidModel﹕ score is 0 for LGE;Nexus 4;KOT49H;4.4.2 compared to alps;EC720;KOT49H;4.4.2 02-03 19:40:40.646 2620-2620/com.mapcushion.android.mapcushionpingl D/AndroidModel﹕ score is 0 for LGE;Nexus 5;LPV79;4.4.2 compared to alps;EC720;KOT49H;4.4.2 02-03 19:40:40.646 2620-2620/com.mapcushion.android.mapcushionpingl W/ModelSpecificdistanceCalculator﹕ Cannot find match for this device. Using default 02-03 19:40:40.648 2620-2620/com.mapcushion.android.mapcushionpingl D/BeaconService﹕ No org.altbeacon.beacon.SimulatedScanData class exists. 02-03 19:40:40.649 2620-2620/com.mapcushion.android.mapcushionpingl D/ActivityThread﹕ SVC-CREATE_SERVICE handled : 0 / CreateServiceData{token=android.os.BinderProxy@41cbbec8 className=org.altbeacon.beacon.service.BeaconService packageName=com.mapcushion.android.mapcushionpingl intent=null} 02-03 19:40:40.650 2620-2620/com.mapcushion.android.mapcushionpingl I/BeaconService﹕ binding 02-03 19:40:40.656 2620-2620/com.mapcushion.android.mapcushionpingl D/ActivityThread﹕ SVC-BIND_SERVICE handled : 0 / BindServiceData{token=android.os.BinderProxy@41cbbec8 intent=Intent { cmp=com.mapcushion.android.mapcushionpingl/org.altbeacon.beacon.service.BeaconService }} 02-03 19:40:40.723 2620-2620/com.mapcushion.android.mapcushionpingl D/GraphicBuffer﹕ create handle(0x552ed2b8) (w:256,h:240,f:1) 02-03 19:40:40.725 2620-2620/com.mapcushion.android.mapcushionpingl I/MaliEGL﹕ [Mali]surface->num_buffers=4,surface->num_frames=3,win_min_undequeued=1 02-03 19:40:40.725 2620-2620/com.mapcushion.android.mapcushionpingl I/MaliEGL﹕ [Mali]max_allowed_dequeued_buffers=3 02-03 19:40:40.725 2620-2620/com.mapcushion.android.mapcushionpingl D/GraphicBuffer﹕ close handle(0x552ed2b8) (w:256 h:240 f:1) 02-03 19:40:40.733 2620-2620/com.mapcushion.android.mapcushionpingl D/GraphicBuffer﹕ create handle(0x553ec108) (w:256,f:1) 02-03 19:40:40.735 2620-2620/com.mapcushion.android.mapcushionpingl D/Openglrenderer﹕ Enabling debug mode 0 02-03 19:40:40.737 2620-2620/com.mapcushion.android.mapcushionpingl D/GraphicBuffer﹕ create handle(0x5542c8a8) (w:768,h:768,f:1) 02-03 19:40:40.741 2620-2620/com.mapcushion.android.mapcushionpingl W/MALI﹕ MTK_AUX_isMTKFormat:168: int MTK_AUX_isMTKFormat(ANativeWindowBuffer_t*): format=1 02-03 19:40:40.743 2620-2620/com.mapcushion.android.mapcushionpingl D/Openglrenderer﹕ setViewport 240x240 <0x553ec690> 02-03 19:40:40.745 2620-2620/com.mapcushion.android.mapcushionpingl D/BeaconManager﹕ we have a connection to the service Now 02-03 19:40:40.747 2620-2620/com.mapcushion.android.mapcushionpingl D/BeaconManager﹕ callback packageName: com.mapcushion.android.mapcushionpingl 02-03 19:40:40.747 2620-2620/com.mapcushion.android.mapcushionpingl D/BeaconManager﹕ This consumer is already bound ... 02-03 19:40:40.814 2620-2620/com.mapcushion.android.mapcushionpingl I/BeaconService﹕ start ranging received 02-03 19:40:40.814 2620-2620/com.mapcushion.android.mapcushionpingl D/BeaconService﹕ Currently ranging 1 regions. 02-03 19:40:40.814 2620-2620/com.mapcushion.android.mapcushionpingl D/CycledLeScanner﹕ start called 02-03 19:40:40.828 2620-2620/com.mapcushion.android.mapcushionpingl D/CycledLeScanner﹕ starting a new scan cycle 02-03 19:40:40.829 2620-2620/com.mapcushion.android.mapcushionpingl D/BluetoothAdapter﹕ isEnabled 02-03 19:40:40.834 2620-2620/com.mapcushion.android.mapcushionpingl D/CycledLeScanner﹕ starting a new bluetooth le scan 02-03 19:40:40.835 2620-2620/com.mapcushion.android.mapcushionpingl D/BluetoothAdapter﹕ startLeScan(): null 02-03 19:40:40.874 2620-2633/com.mapcushion.android.mapcushionpingl D/BluetoothAdapter﹕ onClientRegistered() - status=0 clientIf=1 02-03 19:40:40.879 2620-2620/com.mapcushion.android.mapcushionpingl D/CycledLeScanner﹕ Waiting to stop scan cycle for another 1100 milliseconds 02-03 19:40:40.880 2620-2620/com.mapcushion.android.mapcushionpingl D/CycledLeScanner﹕ Scan started 02-03 19:40:40.880 2620-2620/com.mapcushion.android.mapcushionpingl D/CycledLeScanner﹕ Set scan periods called with 1100,0 Background mode must have changed. 02-03 19:40:40.881 2620-2620/com.mapcushion.android.mapcushionpingl D/CycledLeScanner﹕ We are not in the background. Cancelling wakeup alarm 02-03 19:40:40.881 2620-2620/com.mapcushion.android.mapcushionpingl D/CycledLeScanner﹕ cancel wakeup alarm: null 02-03 19:40:41.084 2620-2634/com.mapcushion.android.mapcushionpingl D/BluetoothAdapter﹕ onScanResult() - Device=E5:E0:20:CF:63:32 RSSI=-45 02-03 19:40:41.084 2620-2634/com.mapcushion.android.mapcushionpingl D/CycledLeScannerForJellyBeanMr2﹕ got record
这是我的代码:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_scan); mHandler = new android.os.Handler(); beaconManager = BeaconManager.getInstanceForApplication(this); beaconManager.setDebug(true); beaconManager.getBeaconParsers().add(new BeaconParser(). setBeaconLayout(" m:2-3=0215,i:4-19,i:20-21,i:22-23,p:24-24")); beaconManager.bind(this); sendbeacons(); } @Override public void onBeaconServiceConnect() { beaconManager.setRangeNotifier(new RangeNotifier() { @Override public void didRangeBeaconsInRegion(Collection<Beacon> beacons,Region region) { System.out.println("------- didRangeBeacons!!!!"); iBeacons = beacons; System.out.println("------ num:: " + iBeacons.size()); /* for(Beacon iBeacon : iBeacons) { Log.i("Beacon","found \nProxUUID: " + iBeacon.getId1() + "\ntx: " + Integer.toString(iBeacon.getTxPower()) + "\nmanu: " + Integer.toString(iBeacon.getManufacturer()) + "\ndistance: " + Double.toString(iBeacon.getdistance()) + "\nRSSI:" + Integer.toString(iBeacon.getRSSi()) + "\nTxPow:" + Integer.toString(iBeacon.getTxPower()) + "\nBeacon type code:" + Double.toString(iBeacon.getBeaconTypeCode()) + "\n------------------------------------------------"); } */ } }); try { beaconManager.startRangingBeaconsInRegion(new Region("briansbeacons",null,null)); } catch(remoteexception e) { e.printstacktrace(); } beaconManager.bind(this); }
编辑1:
添加更多特定日志条目以尝试显示信标检测中的差异:我删除了除一个信标之外的所有信息,我注意到工作设备正在通过UUID识别信标,而非工作设备则不是.但我在工作设备的日志中找不到对Device = E5:E0:20:CF:63:32的任何引用.
Nexus 7(工作):
02-02 23:48:14.795 10727-10751/com.mapcushion.android.mapcushionpingl D/BeaconService﹕ beacon detected multiple times in scan cycle :id1: 2f234454-cf6d-4a0f-adf2-f4911ba9ffa6 id2: 4 id3: 101 02-02 23:48:14.795 10727-10751/com.mapcushion.android.mapcushionpingl D/BeaconService﹕ beacon detected :id1: 2f234454-cf6d-4a0f-adf2-f4911ba9ffa6 id2: 4 id3: 101 02-02 23:48:14.795 10727-10751/com.mapcushion.android.mapcushionpingl D/BeaconService﹕ looking for ranging region matches for this beacon 02-02 23:48:14.795 10727-10751/com.mapcushion.android.mapcushionpingl D/BeaconService﹕ matches ranging region: id1: null id2: null id3: null 02-02 23:48:14.795 10727-10751/com.mapcushion.android.mapcushionpingl D/RangeState﹕ adding id1: 2f234454-cf6d-4a0f-adf2-f4911ba9ffa6 id2: 4 id3: 101 to existing range for: org.altbeacon.beacon.service.RangedBeacon@41eb5380 02-02 23:48:14.915 10727-10738/com.mapcushion.android.mapcushionpingl D/CycledLeScannerForJellyBeanMr2﹕ got record 02-02 23:48:14.915 10727-10759/com.mapcushion.android.mapcushionpingl D/BeaconParser﹕ This is not a matching Beacon advertisement. (Was expecting be ac. The bytes I see are: 02011a0bff4c0009060102c0a801130000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 02-02 23:48:14.915 10727-10759/com.mapcushion.android.mapcushionpingl D/BeaconParser﹕ This is not a matching Beacon advertisement. (Was expecting 02 15. The bytes I see are: 02011a0bff4c0009060102c0a801130000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
SmartWatch(不工作):
02-02 23:46:52.598 3351-3364/com.mapcushion.android.mapcushionpingl D/BluetoothAdapter﹕ onScanResult() - Device=E5:E0:20:CF:63:32 RSSI=-31 02-02 23:46:52.599 3351-3364/com.mapcushion.android.mapcushionpingl D/CycledLeScannerForJellyBeanMr2﹕ got record 02-02 23:46:52.600 3351-3364/com.mapcushion.android.mapcushionpingl D/BluetoothDevice﹕ mAddress: E5:E0:20:CF:63:32 02-02 23:46:52.603 3351-3383/com.mapcushion.android.mapcushionpingl D/BeaconParser﹕ This is not a matching Beacon advertisement. (Was expecting be ac. The bytes I see are: 0201000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 02-02 23:46:52.603 3351-3383/com.mapcushion.android.mapcushionpingl D/BeaconParser﹕ This is not a matching Beacon advertisement. (Was expecting 02 15. The bytes I see are: 0201000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 02-02 23:46:52.605 3351-3383/com.mapcushion.android.mapcushionpingl D/BeaconParser﹕ This is not a matching Beacon advertisement. (Was expecting 02 15. The bytes I see are: 0201000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 02-02 23:46:53.432 3351-3351/com.mapcushion.android.mapcushionpingl D/CycledLeScanner﹕ Waiting to stop scan cycle for another 98 milliseconds 02-02 23:46:53.531 3351-3351/com.mapcushion.android.mapcushionpingl D/CycledLeScanner﹕ Done with scan cycle 02-02 23:46:53.531 3351-3351/com.mapcushion.android.mapcushionpingl D/BeaconService﹕ Calling ranging callback
我注意到的另一件事是,在非工作设备中,对BeaconService的唯一引用如下:
02-02 23:46:52.364 3351-3351/com.mapcushion.android.mapcushionpingl D/BeaconService﹕ Calling ranging callback 02-02 23:46:52.364 3351-3351/com.mapcushion.android.mapcushionpingl D/Callback﹕ attempting callback via intent: ComponentInfo{com.mapcushion.android.mapcushionpingl/org.altbeacon.beacon.BeaconIntentProcessor}
而在工作设备中,大多数信标的记录似乎来自该类…
编辑 – 更新2:
回答David关于MAC地址的问题
以下代码:
beaconManager.setRangeNotifier(new RangeNotifier() { @Override public void didRangeBeaconsInRegion(Collection<Beacon> beacons,Region region) { System.out.println("------- didRangeBeacons!!!!"); iBeacons = beacons; System.out.println("------ num:: " + iBeacons.size()); for(Beacon iBeacon : iBeacons) { Log.i("Beacon","\n------------------------------------------------"); Log.d(TAG,"Mac address is: "+iBeacon.getBluetoothAddress()); Log.i("Beacon","\n------------------------------------------------"); } } });
在工作Nexus 7上产生:
02-03 19:44:57.200 3192-3438/com.mapcushion.android.mapcushionpingl I/System.out﹕ ------- didRangeBeacons!!!! 02-03 19:44:57.200 3192-3438/com.mapcushion.android.mapcushionpingl I/System.out﹕ ------ num:: 1 02-03 19:44:57.200 3192-3438/com.mapcushion.android.mapcushionpingl I/Beacon﹕ ------------------------------------------------ 02-03 19:44:57.200 3192-3438/com.mapcushion.android.mapcushionpingl D/RangingActivity﹕ Mac address is: E5:E0:20:CF:63:32 02-03 19:44:57.200 3192-3438/com.mapcushion.android.mapcushionpingl I/Beacon﹕ ------------------------------------------------
在智能手表上:
02-03 19:40:46.671 2620-2671/com.mapcushion.android.mapcushionpingl I/System.out﹕ ------- didRangeBeacons!!!! 02-03 19:40:46.671 2620-2671/com.mapcushion.android.mapcushionpingl I/System.out﹕ ------ num:: 0
因此BeaconManager(或底层的android API)没有将“设备”视为信标,但它确实用这条线识别具有相同MAC地址的信标:
02-03 19:40:46.486 2620-2633/com.mapcushion.android.mapcushionpingl D/BluetoothDevice﹕ mAddress: E5:E0:20:CF:63:32
编辑3:
我决定退后一步,尝试使用Android蓝牙API直接查询信标.
基本上我只是想输出返回的字节,看看为什么没有识别信标.并且对于相同的信标,输出看起来完全不同,只有前两个字节具有智能手表所见的信标数据,而nexus 7具有30个字节的数据.
到目前为止,我尝试更改SCAN_TIME没有任何效果.手表收到的数据是否有迹象表明它无法读取数据包?
我使用了以下代码:
private static final long SCAN_TIME = 5000; boolean mScanning = false; private void scanLeDevice(final boolean enable) { Log.i(null,"Inside scanLeDevice"); Log.i(null,"scan time is: " + SCAN_TIME); if (enable) { // Stops scanning after a pre-defined scan period. mHandler.postDelayed(new Runnable() { @Override public void run() { mScanning = false; Log.i(null,"Calling stopLeScan"); mBluetoothAdapter.stopLeScan(mLeScanCallback); } },SCAN_TIME); mScanning = true; Log.i(null,"Calling startLeScan"); mBluetoothAdapter.startLeScan(mLeScanCallback); } else { mScanning = false; mBluetoothAdapter.stopLeScan(mLeScanCallback); } } private BluetoothAdapter.LeScanCallback mLeScanCallback = new BluetoothAdapter.LeScanCallback() { @Override public void onLeScan(final BluetoothDevice device,int RSSi,final byte[] scanRecord) { runOnUiThread(new Runnable() { @Override public void run() { Log.i(null,"INSIDE ONLESCAN"); //DO MY WORK Log.i(null,"scanned record: " + scanRecord.length); int startByte = 2; boolean patternFound = false; for(int i=0; i<scanRecord.length; i++) { Log.i(null,"byte " + i + ": " + scanRecord[i]); } while (startByte <= 5) { Log.i(null,"scanned record: " + scanRecord.length); Log.i(null,"Identifier check: " + ((int) scanRecord[startByte + 2] & 0xff) + " == " + 0x02); Log.i(null,"Length of data : " + ((int) scanRecord[startByte + 3] & 0xff) + "==" + (0x15)); //Log.i(null," iBeacon Identifier: " + (scanRecord[startByte + 2] & 0xff)); if (((int) scanRecord[startByte + 2] & 0xff) == 0x02 && //Identifies an iBeacon ((int) scanRecord[startByte + 3] & 0xff) == 0x15) { //Identifies correct data length patternFound = true; break; } startByte++; } if (patternFound) { //Convert to hex String byte[] uuidBytes = new byte[16]; System.arraycopy(scanRecord,startByte+4,uuidBytes,16); String hexString = bytesToHex(uuidBytes); //Here is your UUID String uuid = hexString.substring(0,8) + "-" + hexString.substring(8,12) + "-" + hexString.substring(12,16) + "-" + hexString.substring(16,20) + "-" + hexString.substring(20,32); //Here is your Major value int major = (scanRecord[startByte+20] & 0xff) * 0x100 + (scanRecord[startByte+21] & 0xff); //Here is your Minor value int minor = (scanRecord[startByte+22] & 0xff) * 0x100 + (scanRecord[startByte+23] & 0xff); System.out.println("-------------output------ : " + uuid + " maj: " + major + " min: " + minor ); } } }); } }; }
这是输出:
nexus 7(工作):
02-03 22:50:43.811 7303-7303/com.mapcushion.android.mapcushionpingl I/﹕ INSIDE ONLESCAN 02-03 22:50:43.811 7303-7303/com.mapcushion.android.mapcushionpingl I/﹕ scanned record: 62 02-03 22:50:43.811 7303-7303/com.mapcushion.android.mapcushionpingl I/﹕ byte 0: 2 02-03 22:50:43.811 7303-7303/com.mapcushion.android.mapcushionpingl I/﹕ byte 1: 1 02-03 22:50:43.811 7303-7303/com.mapcushion.android.mapcushionpingl I/﹕ byte 2: 6 02-03 22:50:43.811 7303-7303/com.mapcushion.android.mapcushionpingl I/﹕ byte 3: 26 02-03 22:50:43.811 7303-7303/com.mapcushion.android.mapcushionpingl I/﹕ byte 4: -1 02-03 22:50:43.811 7303-7303/com.mapcushion.android.mapcushionpingl I/﹕ byte 5: 76 02-03 22:50:43.811 7303-7303/com.mapcushion.android.mapcushionpingl I/﹕ byte 6: 0 02-03 22:50:43.821 7303-7303/com.mapcushion.android.mapcushionpingl I/﹕ byte 7: 2 02-03 22:50:43.821 7303-7303/com.mapcushion.android.mapcushionpingl I/﹕ byte 8: 21 02-03 22:50:43.831 7303-7303/com.mapcushion.android.mapcushionpingl I/﹕ byte 9: 47 02-03 22:50:43.831 7303-7303/com.mapcushion.android.mapcushionpingl I/﹕ byte 10: 35 02-03 22:50:43.831 7303-7303/com.mapcushion.android.mapcushionpingl I/﹕ byte 11: 68 02-03 22:50:43.831 7303-7303/com.mapcushion.android.mapcushionpingl I/﹕ byte 12: 84 02-03 22:50:43.831 7303-7303/com.mapcushion.android.mapcushionpingl I/﹕ byte 13: -49 02-03 22:50:43.831 7303-7303/com.mapcushion.android.mapcushionpingl I/﹕ byte 14: 109 02-03 22:50:43.831 7303-7303/com.mapcushion.android.mapcushionpingl I/﹕ byte 15: 74 02-03 22:50:43.831 7303-7303/com.mapcushion.android.mapcushionpingl I/﹕ byte 16: 15 02-03 22:50:43.841 7303-7303/com.mapcushion.android.mapcushionpingl I/﹕ byte 17: -83 02-03 22:50:43.841 7303-7303/com.mapcushion.android.mapcushionpingl I/﹕ byte 18: -14 02-03 22:50:43.841 7303-7303/com.mapcushion.android.mapcushionpingl I/﹕ byte 19: -12 02-03 22:50:43.841 7303-7303/com.mapcushion.android.mapcushionpingl I/﹕ byte 20: -111 02-03 22:50:43.841 7303-7303/com.mapcushion.android.mapcushionpingl I/﹕ byte 21: 27 02-03 22:50:43.841 7303-7303/com.mapcushion.android.mapcushionpingl I/﹕ byte 22: -87 02-03 22:50:43.841 7303-7303/com.mapcushion.android.mapcushionpingl I/﹕ byte 23: -1 02-03 22:50:43.851 7303-7303/com.mapcushion.android.mapcushionpingl I/﹕ byte 24: -90 02-03 22:50:43.851 7303-7303/com.mapcushion.android.mapcushionpingl I/﹕ byte 25: 0 02-03 22:50:43.851 7303-7303/com.mapcushion.android.mapcushionpingl I/﹕ byte 26: 4 02-03 22:50:43.851 7303-7303/com.mapcushion.android.mapcushionpingl I/﹕ byte 27: 0 02-03 22:50:43.851 7303-7303/com.mapcushion.android.mapcushionpingl I/﹕ byte 28: 101 02-03 22:50:43.851 7303-7303/com.mapcushion.android.mapcushionpingl I/﹕ byte 29: -76 02-03 22:50:43.851 7303-7303/com.mapcushion.android.mapcushionpingl I/﹕ byte 30: 0 ... (all 0''s) 02-03 22:50:43.882 7303-7303/com.mapcushion.android.mapcushionpingl I/﹕ byte 61: 0 02-03 22:50:43.882 7303-7303/com.mapcushion.android.mapcushionpingl I/﹕ scanned record: 62 02-03 22:50:43.882 7303-7303/com.mapcushion.android.mapcushionpingl I/﹕ Identifier check: 255 == 2 02-03 22:50:43.882 7303-7303/com.mapcushion.android.mapcushionpingl I/﹕ Length of data : 76==21 02-03 22:50:43.882 7303-7303/com.mapcushion.android.mapcushionpingl I/﹕ scanned record: 62 02-03 22:50:43.882 7303-7303/com.mapcushion.android.mapcushionpingl I/﹕ Identifier check: 76 == 2 02-03 22:50:43.882 7303-7303/com.mapcushion.android.mapcushionpingl I/﹕ Length of data : 0==21 02-03 22:50:43.882 7303-7303/com.mapcushion.android.mapcushionpingl I/﹕ scanned record: 62 02-03 22:50:43.882 7303-7303/com.mapcushion.android.mapcushionpingl I/﹕ Identifier check: 0 == 2 02-03 22:50:43.882 7303-7303/com.mapcushion.android.mapcushionpingl I/﹕ Length of data : 2==21 02-03 22:50:43.882 7303-7303/com.mapcushion.android.mapcushionpingl I/﹕ scanned record: 62 02-03 22:50:43.882 7303-7303/com.mapcushion.android.mapcushionpingl I/﹕ Identifier check: 2 == 2 02-03 22:50:43.882 7303-7303/com.mapcushion.android.mapcushionpingl I/﹕ Length of data : 21==21 02-03 22:50:43.882 7303-7303/com.mapcushion.android.mapcushionpingl I/System.out﹕ -------------output------ : 2F234454-CF6D-4A0F-ADF2-F4911BA9FFA6 maj: 4 min: 101 02-03 22:50:43.912 7303-7303/com.mapcushion.android.mapcushionpingl I/﹕ Calling stopLeScan
smartwatch(不工作):
2-03 22:53:37.374 6177-6189/com.mapcushion.android.mapcushionpingl D/BluetoothAdapter﹕ onScanResult() - Device=E5:E0:20:CF:63:32 RSSI=-46 02-03 22:53:37.376 6177-6177/com.mapcushion.android.mapcushionpingl I/﹕ INSIDE ONLESCAN 02-03 22:53:37.376 6177-6177/com.mapcushion.android.mapcushionpingl I/﹕ scanned record: 62 02-03 22:53:37.376 6177-6177/com.mapcushion.android.mapcushionpingl I/﹕ byte 0: 2 02-03 22:53:37.376 6177-6177/com.mapcushion.android.mapcushionpingl I/﹕ byte 1: 1 02-03 22:53:37.376 6177-6177/com.mapcushion.android.mapcushionpingl I/﹕ byte 2: 0 02-03 22:53:37.376 6177-6177/com.mapcushion.android.mapcushionpingl I/﹕ byte 3: 0 02-03 22:53:37.376 6177-6177/com.mapcushion.android.mapcushionpingl I/﹕ byte 4: 0 02-03 22:53:37.376 6177-6177/com.mapcushion.android.mapcushionpingl I/﹕ byte 5: 0 02-03 22:53:37.376 6177-6177/com.mapcushion.android.mapcushionpingl I/﹕ byte 6: 0 ... (all 0''s) 02-03 22:53:37.378 6177-6177/com.mapcushion.android.mapcushionpingl I/﹕ byte 61: 0 02-03 22:53:37.378 6177-6177/com.mapcushion.android.mapcushionpingl I/﹕ scanned record: 62 02-03 22:53:37.378 6177-6177/com.mapcushion.android.mapcushionpingl I/﹕ Identifier check: 0 == 2 02-03 22:53:37.378 6177-6177/com.mapcushion.android.mapcushionpingl I/﹕ Length of data : 0==21 02-03 22:53:37.378 6177-6177/com.mapcushion.android.mapcushionpingl I/﹕ scanned record: 62 02-03 22:53:37.378 6177-6177/com.mapcushion.android.mapcushionpingl I/﹕ Identifier check: 0 == 2 02-03 22:53:37.378 6177-6177/com.mapcushion.android.mapcushionpingl I/﹕ Length of data : 0==21 02-03 22:53:37.378 6177-6177/com.mapcushion.android.mapcushionpingl I/﹕ scanned record: 62 02-03 22:53:37.378 6177-6177/com.mapcushion.android.mapcushionpingl I/﹕ Identifier check: 0 == 2 02-03 22:53:37.378 6177-6177/com.mapcushion.android.mapcushionpingl I/﹕ Length of data : 0==21 02-03 22:53:37.378 6177-6177/com.mapcushion.android.mapcushionpingl I/﹕ scanned record: 62 02-03 22:53:37.378 6177-6177/com.mapcushion.android.mapcushionpingl I/﹕ Identifier check: 0 == 2 02-03 22:53:37.378 6177-6177/com.mapcushion.android.mapcushionpingl I/﹕ Length of data : 0==21 02-03 22:53:37.643 6177-6177/com.mapcushion.android.mapcushionpingl I/﹕ Calling stopLeScan 02-03 22:53:37.643 6177-6177/com.mapcushion.android.mapcushionpingl D/BluetoothAdapter﹕ stopLeScan() 02-03 22:53:37.743 6177-6177/com.mapcushion.android.mapcushionpingl I/﹕ Calling stopLeScan 02-03 22:53:37.743 6177-6177/com.mapcushion.android.mapcushionpingl D/BluetoothAdapter﹕ stopLeScan()
解决方法
0201000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
虽然Nexus 7将其读作一个非常不同的字节序列:
02011a0bff4c0009060102c0a801130000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
我必须得出结论,手表没有正确读取BLE制造商的广告 – 它在两个字节后截断它们.
问题可能是MTK6572 ROM,硬件或两者协同工作的方式.为了其他人,可能值得记录完整的手表配置.
Android File Transfer – 在 Mac 上也能读取 Android 设备文件
Android File Transfer – 在 Mac 上也能读取 Android 设备文件[OS X]
由于 Mac OS X 本身并不支持 MTP 协议,所以通过 USB 将 Android 设备连接到 Mac 电脑上是无法识别的,更别说读取里面的文件了。针对这一个问题, Google 官方推出了 Android File Transfer 这款工具好让 Mac 也能读取 Android 设备里的文件。
只需要在连接手机前运行 Android File Transfer ,再连接手机,那么 Mac 就会识别出 Android 设备,并可以对里面的文件进行复制、粘贴、删除等管理。启动过一次 Android File Transfer 后,以后每次只要连接 Android 设备 Android File Transfer 都会自动启动。
目前 Android File Transfer 只支持 Android 3.0 及以上的机器,支持传输最大 4GB 的文件。
Ps:很多朋友说连接到电脑了但是检测不到设备,请将连接方式设置为媒体设备(MTP)即可。
Android Manifest使用权限与Android设备规格
<uses-sdk android:minSdkVersion="10" android:targetSdkVersion="17" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="com.android.launcher.permission.UNINSTALL_SHORTCUT" /> <uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT" /> <uses-permission android:name="android.permission.VIBRATE" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.READ_PHONE_STATE" /> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.SEND_SMS" /> <uses-permission android:name="android.permission.RECEIVE_SMS" /> <uses-permission android:name="android.permission.READ_SMS" /> <uses-permission android:name="android.permission.WRITE_SMS" /> <uses-permission android:name="android.permission.GET_ACCOUNTS" /> <!-- Keeps the processor from sleeping when a message is received. --> <uses-permission android:name="android.permission.WAKE_LOCK" /> <!-- for reading contacts --> <uses-permission android:name="android.permission.READ_CONTACTS" /> <!-- Creates a custom permission so only this app can receive its messages. NOTE: the permission *must* be called PACKAGE.permission.C2D_MESSAGE,where PACKAGE is the application''s package name. --> <permission android:name="com.s5.safetylink.permission.C2D_MESSAGE" android:protectionLevel="signature" /> <uses-permission android:name="com.s5.safetylink.permission.C2D_MESSAGE" /> <!-- This application has permission to register and receive data message. --> <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
有人可以提供任何链接或文章,我可以记录权限和设备规格,以了解为什么我的Android应用程序与特定设备不兼容或为什么它没有在特定设备上的Play商店中显示?
任何帮助将受到高度赞赏.
解决方法
一般情况下,如果你的应用需要一定的权限需要某些硬件(例如相机),那么即使你没有在该部分下声明它,谷歌播放也会将你的应用程序过滤掉那些不支持某些硬件的设备. .. 希望这可以帮助
关于Android 应用读写设备节点和android读写权限的介绍现已完结,谢谢您的耐心阅读,如果想了解更多关于Android app如何正确读写系统sys设备节点、Android Beacon Library在一台Android 4.4设备上运行良好,但在另一台Android设备上运行良好、Android File Transfer – 在 Mac 上也能读取 Android 设备文件、Android Manifest使用权限与Android设备规格的相关知识,请在本站寻找。
本文标签: