GVKun编程网logo

Android 应用读写设备节点(android读写权限)

62

如果您对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 应用读写设备节点(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设备节点

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设备上运行良好

Android Beacon Library在一台Android 4.4设备上运行良好,但在另一台Android设备上运行良好

更新:我尝试了一种更直接的方法(参见下面的编辑3),这使得手表上的信标缺乏有趣的数据.

有关非工作设备的详细信息.
智能手表(通用)列为蓝牙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()

解决方法

由于您使用Nexus 7确认信标的Mac地址为E5:E0:20:CF:63:32,您会看到该手表的广告显示为:

0201000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

虽然Nexus 7将其读作一个非常不同的字节序列:

02011a0bff4c0009060102c0a801130000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

我必须得出结论,手表没有正确读取BLE制造商的广告 – 它在两个字节后截断它们.

问题可能是MTK6572 ROM,硬件或两者协同工作的方式.为了其他人,可能值得记录完整的手表配置.

Android File Transfer – 在 Mac 上也能读取 Android 设备文件

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设备规格

Android Manifest使用权限与Android设备规格

有没有办法检查为什么 my Android application在某些设备上没有显示在Play商店中,如三星galaxy S Duos,Samsung Ace Plus和Micromax A110等?虽然我可以手动在这些设备上通过USB ADB(Eclipse)安装我的应用程序.以下是Manifest使用权限:

<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商店中显示?

任何帮助将受到高度赞赏.

解决方法

我建议你看看这个: http://developer.android.com/google/play/filters.html

一般情况下,如果你的应用需要一定的权限需要某些硬件(例如相机),那么即使你没有在该部分下声明它,谷歌播放也会将你的应用程序过滤掉那些不支持某些硬件的设备. .. 希望这可以帮助

关于Android 应用读写设备节点android读写权限的介绍现已完结,谢谢您的耐心阅读,如果想了解更多关于Android app如何正确读写系统sys设备节点、Android Beacon Library在一台Android 4.4设备上运行良好,但在另一台Android设备上运行良好、Android File Transfer – 在 Mac 上也能读取 Android 设备文件、Android Manifest使用权限与Android设备规格的相关知识,请在本站寻找。

本文标签: