HBuilderX

HBuilderX

极客开发工具
uni-app

uni-app

开发一次,多端覆盖
uniCloud

uniCloud

云开发平台
HTML5+

HTML5+

增强HTML5的功能体验
MUI

MUI

上万Star的前端框架

说真的。文档体验绝了

文档

说真的。文档体验绝了,真的绝了。

我们用开源的东西本不该开口索要的,uni-app也算是你们的一个产品了。 你们也有商业模式,能否将文档好好整理一下, 文档体验简直不要太好

说真的。文档体验绝了,真的绝了。

我们用开源的东西本不该开口索要的,uni-app也算是你们的一个产品了。 你们也有商业模式,能否将文档好好整理一下, 文档体验简直不要太好

tag的监听事件方法。

代码渲染的titleNView 里的tag如何监听。代码如下。
假设你的tags里有一个子tag left 距离是30,宽度是130。
//那么就先定义监听区域
plus.webview.currentWebview().getTitleNView().setTouchEventRect({top:'0px',left:'30px',width:'130px',height:'100%'})
//创建监听。
plus.webview.currentWebview().getTitleNView().addEventListener("click",function(e){ })

注:setTouchEventRect 可以传数组。多个区域监听。
有问题欢迎留言,大家一起讨论。

继续阅读 »

代码渲染的titleNView 里的tag如何监听。代码如下。
假设你的tags里有一个子tag left 距离是30,宽度是130。
//那么就先定义监听区域
plus.webview.currentWebview().getTitleNView().setTouchEventRect({top:'0px',left:'30px',width:'130px',height:'100%'})
//创建监听。
plus.webview.currentWebview().getTitleNView().addEventListener("click",function(e){ })

注:setTouchEventRect 可以传数组。多个区域监听。
有问题欢迎留言,大家一起讨论。

收起阅读 »

3.2.16.20211122 无法打包h5

h5

我回退了版本就可以了

我回退了版本就可以了

uniapp直接跳转应用商店

// 跳转应用商店
export const jumpToAppMarket = (code) => {
// 可以根據文檔換成其他商店 https://www.jianshu.com/p/b544810beac3
const googlePlay = "com.android.vending";

if (plus.os.name == "Android") {  
    var Uri = plus.android.importClass("android.net.Uri");  
    var Intent = plus.android.importClass('android.content.Intent');  
    var main = plus.android.runtimeMainActivity();  

    var uri = Uri.parse("market://details?id=" + 包名);  
    var intent = new Intent(Intent.ACTION_VIEW, uri);  
    // 选择进入商店  
    intent.setPackage(googlePlay);  
    intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK;  
    // 没有该商店应用  
    if (intent.resolveActivity(main.getPackageManager()) !== null) {  
        main.startActivity(intent);  
    } else {  
        // 跳转浏览器  
        let uri = Uri.parse("https://play.google.com/store/apps/details?id=" + 包名);  
        let intent = new Intent(Intent.ACTION_VIEW, uri);  
        intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK;  
        intent.setPackage('com.android.browser');  
        main.startActivity(intent);  
    }  
} else {  
    plus.runtime.openURL('itms-apps://itunes.apple.com/cn/app/id{appid}?mt=8');  
}  

}

继续阅读 »

// 跳转应用商店
export const jumpToAppMarket = (code) => {
// 可以根據文檔換成其他商店 https://www.jianshu.com/p/b544810beac3
const googlePlay = "com.android.vending";

if (plus.os.name == "Android") {  
    var Uri = plus.android.importClass("android.net.Uri");  
    var Intent = plus.android.importClass('android.content.Intent');  
    var main = plus.android.runtimeMainActivity();  

    var uri = Uri.parse("market://details?id=" + 包名);  
    var intent = new Intent(Intent.ACTION_VIEW, uri);  
    // 选择进入商店  
    intent.setPackage(googlePlay);  
    intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK;  
    // 没有该商店应用  
    if (intent.resolveActivity(main.getPackageManager()) !== null) {  
        main.startActivity(intent);  
    } else {  
        // 跳转浏览器  
        let uri = Uri.parse("https://play.google.com/store/apps/details?id=" + 包名);  
        let intent = new Intent(Intent.ACTION_VIEW, uri);  
        intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK;  
        intent.setPackage('com.android.browser');  
        main.startActivity(intent);  
    }  
} else {  
    plus.runtime.openURL('itms-apps://itunes.apple.com/cn/app/id{appid}?mt=8');  
}  

}

收起阅读 »

基于uniapp打包生成app,并引入本地原生插件步骤和踩坑

uniapp原生插件

看到社区很多同学对于uniapp和原生混合开发配置问题,就怎么引入原生本地插件并配置运行步骤详解
1.首先在你的文件夹下建nativeplugins目录,将本地开发的原生插件代码包按照格式放入

2.对nativeplugins目录下的pack.json进行配置 注意name和id要与目录名保持一致,class要安卓小伙伴给你,包名 类名

3.在manifest.json进行插件引入

第四步:点击运行到手机或模拟器,先制定基座,制作完成后在运行基座选择自定义基座,进行打包即可

继续阅读 »

看到社区很多同学对于uniapp和原生混合开发配置问题,就怎么引入原生本地插件并配置运行步骤详解
1.首先在你的文件夹下建nativeplugins目录,将本地开发的原生插件代码包按照格式放入

2.对nativeplugins目录下的pack.json进行配置 注意name和id要与目录名保持一致,class要安卓小伙伴给你,包名 类名

3.在manifest.json进行插件引入

第四步:点击运行到手机或模拟器,先制定基座,制作完成后在运行基座选择自定义基座,进行打包即可

收起阅读 »

录音支持暂停、继续、后台录音、息屏录音(ios、andorid)

录音支持暂停、继续、后台录音、息屏录音(ios、andorid) :https://ext.dcloud.net.cn/plugin?id=5849

录音支持暂停、继续、后台录音、息屏录音(ios、andorid) :https://ext.dcloud.net.cn/plugin?id=5849

强制安卓进入前台运行,完整代码及遇到的坑

安卓 uniapp原生插件

​最近突发奇想,想做一个给自己用的app,主要时做一些个人记录和强制停止无脑刷屏==。
在每次解锁手机或刷视频超过一定时间,后台就把自己开发的app进入前台,提醒自己的目标及可以做其他的事有什么。
网上的资料并不能完整的解决问题,然后就自己撸了一下代码。
todo 之后有空的话把这部分打包成一个uniapp的插件。

完整代码

    Timer topTimer=null;  

    public void startTopTimer(){  
        stopTopTimer();  
        topTimer=new Timer();  
        TimerTask timerTask=new TimerTask() {  
            @Override  
            public void run() {  
                activityInTop();  
            }  
        };  
        topTimer.schedule(timerTask,0,500);  
    }  

    public void stopTopTimer(){  
        if(topTimer!=null){  
            topTimer.cancel();  
            topTimer=null;  
        }  
    }  

    public void activityInTop() {  
        /**获取ActivityManager*/  
        ActivityManager activityManager = (ActivityManager) getApplicationContext().getSystemService(ACTIVITY_SERVICE);  

        /**获得当前运行的task(任务)*/  
        int nowPosition=0;  
        List<ActivityManager.RunningTaskInfo> taskInfoList = activityManager.getRunningTasks(100);  
        for (ActivityManager.RunningTaskInfo taskInfo : taskInfoList) {  
            /**找到本应用的 task,并将它切换到前台*/  
            if (taskInfo.topActivity.getPackageName().equals(getApplicationContext().getPackageName())) {  
                if(nowPosition==0){  
                    stopTopTimer();  
                    return;  
                }  
                activityManager.moveTaskToFront(taskInfo.id, 0);  
                Log.d(TAG, "找到本应用的 task,并将它切换到前台");  
                return;  
            }  
            nowPosition++;  
        }  
        // 应用需要置顶且前台应用被关闭时,重新打开应用  
        Intent intent=getPackageManager().getLaunchIntentForPackage(getPackageName());  
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);  
        startActivity(intent);  
    }

使用

startTopTimer();

碰到的坑

应用被关闭时,service需要拉起一个新的应用

// 应用需要置顶且前台应用被关闭时,重新打开应用  
        Intent intent=getPackageManager().getLaunchIntentForPackage(getPackageName());  
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);  
        startActivity(intent);

moveTaskToFront需要在应用进入后台5-7s后执行

解决方案:执行moveTaskToFront方法后,判断是否成功。不成功每间隔500ms再执行一次,直到成功为止。

继续阅读 »

​最近突发奇想,想做一个给自己用的app,主要时做一些个人记录和强制停止无脑刷屏==。
在每次解锁手机或刷视频超过一定时间,后台就把自己开发的app进入前台,提醒自己的目标及可以做其他的事有什么。
网上的资料并不能完整的解决问题,然后就自己撸了一下代码。
todo 之后有空的话把这部分打包成一个uniapp的插件。

完整代码

    Timer topTimer=null;  

    public void startTopTimer(){  
        stopTopTimer();  
        topTimer=new Timer();  
        TimerTask timerTask=new TimerTask() {  
            @Override  
            public void run() {  
                activityInTop();  
            }  
        };  
        topTimer.schedule(timerTask,0,500);  
    }  

    public void stopTopTimer(){  
        if(topTimer!=null){  
            topTimer.cancel();  
            topTimer=null;  
        }  
    }  

    public void activityInTop() {  
        /**获取ActivityManager*/  
        ActivityManager activityManager = (ActivityManager) getApplicationContext().getSystemService(ACTIVITY_SERVICE);  

        /**获得当前运行的task(任务)*/  
        int nowPosition=0;  
        List<ActivityManager.RunningTaskInfo> taskInfoList = activityManager.getRunningTasks(100);  
        for (ActivityManager.RunningTaskInfo taskInfo : taskInfoList) {  
            /**找到本应用的 task,并将它切换到前台*/  
            if (taskInfo.topActivity.getPackageName().equals(getApplicationContext().getPackageName())) {  
                if(nowPosition==0){  
                    stopTopTimer();  
                    return;  
                }  
                activityManager.moveTaskToFront(taskInfo.id, 0);  
                Log.d(TAG, "找到本应用的 task,并将它切换到前台");  
                return;  
            }  
            nowPosition++;  
        }  
        // 应用需要置顶且前台应用被关闭时,重新打开应用  
        Intent intent=getPackageManager().getLaunchIntentForPackage(getPackageName());  
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);  
        startActivity(intent);  
    }

使用

startTopTimer();

碰到的坑

应用被关闭时,service需要拉起一个新的应用

// 应用需要置顶且前台应用被关闭时,重新打开应用  
        Intent intent=getPackageManager().getLaunchIntentForPackage(getPackageName());  
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);  
        startActivity(intent);

moveTaskToFront需要在应用进入后台5-7s后执行

解决方案:执行moveTaskToFront方法后,判断是否成功。不成功每间隔500ms再执行一次,直到成功为止。

收起阅读 »

开发境外软件,需要调用谷歌地图

开发境外软件,需要调用谷歌地图

开发境外软件,需要调用谷歌地图

Android 音乐通知栏Native.js版本!

Native.JS uni_app

代码

const androidNotifi = {  
  NotifyID: 237,  
  receiver:null,  
  NotifiService:null,  
  serv: null,  
  intent: null,  
  mNotificationBuild: null,  
  mediaBtn: null,  
  channelID : '1',  
  channelName : '音乐通知',  
  notifiImg:{},  
  getImgTemp: function(audioImage) {  
    return new Promise(resolve => {  
      if (this.notifiImg[encodeURIComponent(audioImage)]) {  
        return resolve(plus.io.convertLocalFileSystemURL(this.notifiImg[encodeURIComponent(audioImage)]));  
      }  
      if(!/^http/.test(audioImage)) {  
        this.notifiImg[encodeURIComponent(audioImage)] = audioImage ? audioImage : '_www/static/image/notifimusic.png';  
        return resolve(plus.io.convertLocalFileSystemURL(audioImage ? audioImage : '_www/static/image/notifimusic.png'));  
      }  
      uni.downloadFile({  
        url: audioImage,  
        complete: res => {  
          this.notifiImg[encodeURIComponent(audioImage)] = res.tempFilePath ? res.tempFilePath : '_www/static/image/notifimusic.png';  
          return resolve(plus.io.convertLocalFileSystemURL(res.tempFilePath ? res.tempFilePath : '_www/static/image/notifimusic.png'));  
        }  
      });  
    });  
  },  
  hideNotifi: function(server = false){  
    this.main&&this.receiver&&this.main.unregisterReceiver(this.receiver);   
    server&&this.serv&&this.serv.stopForeground&&this.serv.stopForeground(this.NotifyID, this.mNotificationBuild) ;  
    if (Number(plus.os.version.split('.')[0])>= 8){     
      this.NotifiService&&this.NotifiService.cancel&&this.NotifiService.cancel(this.channelID,this.NotifyID);   
    } else {      
      this.NotifiService&&this.NotifiService.cancel&&this.NotifiService.cancel(this.NotifyID);   

    }   
    this.receiver = null;  
    this.NotifiService = null;  
    this.serv = null;  
    this.intent = null;  
    this.mNotificationBuild = null;  
    // this.NotifiService&&this.NotifiService.cancelAll&&this.NotifiService.cancelAll();  
    this.mediaBtn ? this.mediaBtn.release() : ''; // 线控销毁  
  },  
  showNotifi:async function(param) {  
    if (uni.$_sko.systemInfo.platform != 'android') {   
      return;  
    }  
    try{  
      param = Object.assign({  
        title : '通知标题',  
        subTitle: '',  
        cont : '通知内容',  
        isPlay: true, // 媒体播放按钮  
        legIcon : plus.io.convertLocalFileSystemURL('_www/static/image/notifimusic.png'),  
        Ongoing : false,    // 不可删除  
      },param);  
      this.main = this.main ? this.main : plus.android.runtimeMainActivity();    
      var Context = plus.android.importClass("android.content.Context");    
      var BitmapFactory = plus.android.importClass("android.graphics.BitmapFactory");    
      var NotificationManager = plus.android.importClass("android.app.NotificationManager");  
      var Notification = plus.android.importClass("android.app.Notification");;    
      var Intent = plus.android.importClass("android.content.Intent");    
      var PendingIntent = plus.android.importClass("android.app.PendingIntent");    
      var androidR = plus.android.importClass("android.R");    
      this.NotifiService = this.NotifiService ? this.NotifiService : this.main.getSystemService(Context.NOTIFICATION_SERVICE);    
      this.intent = this.intent ? this.intent : new Intent(this.main, this.main.getClass());    
      var UNI_MEDIA_BROAD = this.main.getPackageName() + '.mediaBtn';  

      //PendingIntent.getActivity的第二个参数需要设置为随机数,否则多个通知时会导致前面的通知被后面的通知替换Extra的数据    
      var pendingIntent = PendingIntent.getActivity(this.main, 0, this.intent, PendingIntent.FLAG_CANCEL_CURRENT);    
      var firstVersionNumber = Number(plus.os.version.split('.')[0]);    
      var mNotification;    
       //判断当前系统版本在8.0及以上    
      if (firstVersionNumber >= 8){  
          if (this.NotifiService.getNotificationChannel() == null){    
              var NotificationChannel = plus.android.importClass('android.app.NotificationChannel');    
              var channel = new NotificationChannel(this.channelID, this.channelName, NotificationManager.IMPORTANCE_HIGH);      
              this.NotifiService.createNotificationChannel(channel);      
              plus.android.autoCollection(NotificationChannel);  
          }    
          param.callBack&&this.main.startForegroundService(this.intent);  
          mNotification = new Notification.Builder(this.main, this.channelID);    
      } else {      
          mNotification = new Notification.Builder(this.main);      
          param.callBack&&this.main.startService(this.intent);  
      }      

      if(param.callBack) {  
        mNotification.addAction(androidR.drawable.ic_media_previous, "prev", PendingIntent.getBroadcast(this.main, 0, new Intent().setAction(UNI_MEDIA_BROAD + '.prev'), PendingIntent.FLAG_CANCEL_CURRENT));  
        mNotification.addAction((param.isPlay ? androidR.drawable.ic_media_pause : androidR.drawable.ic_media_play), "play", PendingIntent.getBroadcast(this.main, 0, new Intent().setAction(UNI_MEDIA_BROAD + '.play'), PendingIntent.FLAG_CANCEL_CURRENT));  
        mNotification.addAction(androidR.drawable.ic_media_next, "next", PendingIntent.getBroadcast(this.main, 0, new Intent().setAction(UNI_MEDIA_BROAD + '.next'), PendingIntent.FLAG_CANCEL_CURRENT));  
        var mMediaStyle = new Notification.MediaStyle();  
        mMediaStyle.setShowActionsInCompactView(0, 1, 2);  
        mNotification.setStyle(mMediaStyle);  
      }  
      mNotification.setOngoing(param.Ongoing);        
      param.legIcon&&mNotification.setLargeIcon(BitmapFactory.decodeFile(await this.getImgTemp(param.legIcon)));  
       mNotification.setSmallIcon(param.callBack?androidR.drawable.stat_sys_headset:androidR.drawable.stat_notify_chat); //设置图标    
       mNotification.setContentTitle(param.title);//设置标题  
       mNotification.setContentText(param.cont); //设置内容    
       param.subTitle&&mNotification.setSubText(param.subTitle);        //子内容暂时去掉    
       // mNotification.setAutoCancel(true);       //设置点击消失    
       //  mNotification.setShowWhen(true);         //显示通知时间    
       mNotification.setTicker("PadInfo");       //弹出通知    
       mNotification.setDefaults(Notification.DEFAULT_ALL);    
       // mNotification.setPriority(Notification.PRIORITY_DEFAULT);   //通知优先级      
       // mNotification.flags=Notification.FLAG_ONLY_ALERT_ONCE;     //发起通知时震动      
       mNotification.setContentIntent(pendingIntent);      

       this.mNotificationBuild = mNotification.build();  
       if (firstVersionNumber>= 8){      
         this.NotifiService.notify(this.channelID, this.NotifyID, this.mNotificationBuild);        
       } else {      
         this.NotifiService.notify(this.NotifyID, this.mNotificationBuild);      
       }   
       if(param.callBack) {  
          this.main&&this.receiver&&this.main.unregisterReceiver(this.receiver);   
          this.receiver = this.receiver ? this.receiver : plus.android.implements('io.dcloud.android.content.BroadcastReceiver', {    
            onReceive: function(context, intent) { //实现onReceiver回调函数    
              param.callBack(intent.getAction().replace(UNI_MEDIA_BROAD + '.',''));    
            }    
          });   
        var IntentFilter = plus.android.importClass('android.content.IntentFilter');    
        var filter = new IntentFilter();    
        filter.addAction(UNI_MEDIA_BROAD + '.prev');  
        filter.addAction(UNI_MEDIA_BROAD + '.play');  
        filter.addAction(UNI_MEDIA_BROAD + '.next');  
        this.main.unregisterReceiver(this.receiver);  
        this.main.registerReceiver(this.receiver, filter); //注册监听    
        this.mediaBtn = uni.requireNativePlugin('uniMediaButton');  // 监听线控  需要配合附件中的插件( Android API >= 26)  
        this.mediaBtn.initMediaButton(res => {  
           console.log(res.message);  
          // 绑定失败/销毁  
          if(res.code == '-1') {  
            this.mediaBtn = null;  
            return;  
          }  
           // res.keyAction == 1 按键松开 res.keyAction == 0 按键按下 播放按钮肯能只有按下  
          if(res.keyCode && res.keyAction == '0') {  
            switch (res.keyCode){  
              case 88:  
                param.callBack(  
                  'prev'  
                );  
                break;  
              case 87:  
                param.callBack(  
                  'next'  
                );  
                break;  
              case 127:  
              case 126:  
                param.callBack(  
                  'play'  
                );  
                break;  
            }  
          }  
        });  
        var serv = plus.android.importClass("android.app.Service");  
        this.serv = this.serv ? this.serv : new serv();  
        this.serv.startForeground(this.NotifyID, this.mNotificationBuild);  
        plus.android.autoCollection(serv);  
        plus.android.autoCollection(IntentFilter);  
       }  
      plus.android.autoCollection(Context);  
      plus.android.autoCollection(BitmapFactory);  
      plus.android.autoCollection(NotificationManager);  
      plus.android.autoCollection(Notification);  
      plus.android.autoCollection(Intent);  
      plus.android.autoCollection(PendingIntent);  
      plus.android.autoCollection(androidR);  
      plus.android.autoCollection(this.receiver);  

    }catch(e){  
      console.log(e);  
    }  
  }  
};

使用方法

// 开启 - 更新标题/播放(暂停)按钮  
show();  
function show(){  
    androidNotifi.showNotifi({  
        title : '通知标题',  
        subTitle: '通知小标题',  
        cont : '通知内容',  
        isPlay: true, // 媒体播放按钮状态(控制播放/暂停按钮样式)  
        legIcon : '', // 封面图片  
        Ongoing : false,    // 是否可删除  
        callBack:function(res){  
            switch (res){  
            case 'play':  
        console.log('play');  
        break;  
        case 'prev':  
        console.log('prev');  
        break;  
        case 'next':  
        console.log('next');  
        break;  
        }  
        }  
    })  
}  
// 关闭  
function hide(){  
    androidNotifi.hideNotifi();  
}  

由于Android播放视频没有通知栏控制.开始一直使用XZH-musicNotification 的插件,但是由于版本更新,出现BUG(插件已更新).
但是不能总等插件更新,就自己动动手写了一个Native.js版本,由于手上设备不多,没有测试更多的兼容性.在这里希望大家能勇于使用修改提出问题,完善此通知提示!
附件是线控耳机、蓝牙耳机按键监听插件(API >= 26,X86好像不支持忘了)

继续阅读 »

代码

const androidNotifi = {  
  NotifyID: 237,  
  receiver:null,  
  NotifiService:null,  
  serv: null,  
  intent: null,  
  mNotificationBuild: null,  
  mediaBtn: null,  
  channelID : '1',  
  channelName : '音乐通知',  
  notifiImg:{},  
  getImgTemp: function(audioImage) {  
    return new Promise(resolve => {  
      if (this.notifiImg[encodeURIComponent(audioImage)]) {  
        return resolve(plus.io.convertLocalFileSystemURL(this.notifiImg[encodeURIComponent(audioImage)]));  
      }  
      if(!/^http/.test(audioImage)) {  
        this.notifiImg[encodeURIComponent(audioImage)] = audioImage ? audioImage : '_www/static/image/notifimusic.png';  
        return resolve(plus.io.convertLocalFileSystemURL(audioImage ? audioImage : '_www/static/image/notifimusic.png'));  
      }  
      uni.downloadFile({  
        url: audioImage,  
        complete: res => {  
          this.notifiImg[encodeURIComponent(audioImage)] = res.tempFilePath ? res.tempFilePath : '_www/static/image/notifimusic.png';  
          return resolve(plus.io.convertLocalFileSystemURL(res.tempFilePath ? res.tempFilePath : '_www/static/image/notifimusic.png'));  
        }  
      });  
    });  
  },  
  hideNotifi: function(server = false){  
    this.main&&this.receiver&&this.main.unregisterReceiver(this.receiver);   
    server&&this.serv&&this.serv.stopForeground&&this.serv.stopForeground(this.NotifyID, this.mNotificationBuild) ;  
    if (Number(plus.os.version.split('.')[0])>= 8){     
      this.NotifiService&&this.NotifiService.cancel&&this.NotifiService.cancel(this.channelID,this.NotifyID);   
    } else {      
      this.NotifiService&&this.NotifiService.cancel&&this.NotifiService.cancel(this.NotifyID);   

    }   
    this.receiver = null;  
    this.NotifiService = null;  
    this.serv = null;  
    this.intent = null;  
    this.mNotificationBuild = null;  
    // this.NotifiService&&this.NotifiService.cancelAll&&this.NotifiService.cancelAll();  
    this.mediaBtn ? this.mediaBtn.release() : ''; // 线控销毁  
  },  
  showNotifi:async function(param) {  
    if (uni.$_sko.systemInfo.platform != 'android') {   
      return;  
    }  
    try{  
      param = Object.assign({  
        title : '通知标题',  
        subTitle: '',  
        cont : '通知内容',  
        isPlay: true, // 媒体播放按钮  
        legIcon : plus.io.convertLocalFileSystemURL('_www/static/image/notifimusic.png'),  
        Ongoing : false,    // 不可删除  
      },param);  
      this.main = this.main ? this.main : plus.android.runtimeMainActivity();    
      var Context = plus.android.importClass("android.content.Context");    
      var BitmapFactory = plus.android.importClass("android.graphics.BitmapFactory");    
      var NotificationManager = plus.android.importClass("android.app.NotificationManager");  
      var Notification = plus.android.importClass("android.app.Notification");;    
      var Intent = plus.android.importClass("android.content.Intent");    
      var PendingIntent = plus.android.importClass("android.app.PendingIntent");    
      var androidR = plus.android.importClass("android.R");    
      this.NotifiService = this.NotifiService ? this.NotifiService : this.main.getSystemService(Context.NOTIFICATION_SERVICE);    
      this.intent = this.intent ? this.intent : new Intent(this.main, this.main.getClass());    
      var UNI_MEDIA_BROAD = this.main.getPackageName() + '.mediaBtn';  

      //PendingIntent.getActivity的第二个参数需要设置为随机数,否则多个通知时会导致前面的通知被后面的通知替换Extra的数据    
      var pendingIntent = PendingIntent.getActivity(this.main, 0, this.intent, PendingIntent.FLAG_CANCEL_CURRENT);    
      var firstVersionNumber = Number(plus.os.version.split('.')[0]);    
      var mNotification;    
       //判断当前系统版本在8.0及以上    
      if (firstVersionNumber >= 8){  
          if (this.NotifiService.getNotificationChannel() == null){    
              var NotificationChannel = plus.android.importClass('android.app.NotificationChannel');    
              var channel = new NotificationChannel(this.channelID, this.channelName, NotificationManager.IMPORTANCE_HIGH);      
              this.NotifiService.createNotificationChannel(channel);      
              plus.android.autoCollection(NotificationChannel);  
          }    
          param.callBack&&this.main.startForegroundService(this.intent);  
          mNotification = new Notification.Builder(this.main, this.channelID);    
      } else {      
          mNotification = new Notification.Builder(this.main);      
          param.callBack&&this.main.startService(this.intent);  
      }      

      if(param.callBack) {  
        mNotification.addAction(androidR.drawable.ic_media_previous, "prev", PendingIntent.getBroadcast(this.main, 0, new Intent().setAction(UNI_MEDIA_BROAD + '.prev'), PendingIntent.FLAG_CANCEL_CURRENT));  
        mNotification.addAction((param.isPlay ? androidR.drawable.ic_media_pause : androidR.drawable.ic_media_play), "play", PendingIntent.getBroadcast(this.main, 0, new Intent().setAction(UNI_MEDIA_BROAD + '.play'), PendingIntent.FLAG_CANCEL_CURRENT));  
        mNotification.addAction(androidR.drawable.ic_media_next, "next", PendingIntent.getBroadcast(this.main, 0, new Intent().setAction(UNI_MEDIA_BROAD + '.next'), PendingIntent.FLAG_CANCEL_CURRENT));  
        var mMediaStyle = new Notification.MediaStyle();  
        mMediaStyle.setShowActionsInCompactView(0, 1, 2);  
        mNotification.setStyle(mMediaStyle);  
      }  
      mNotification.setOngoing(param.Ongoing);        
      param.legIcon&&mNotification.setLargeIcon(BitmapFactory.decodeFile(await this.getImgTemp(param.legIcon)));  
       mNotification.setSmallIcon(param.callBack?androidR.drawable.stat_sys_headset:androidR.drawable.stat_notify_chat); //设置图标    
       mNotification.setContentTitle(param.title);//设置标题  
       mNotification.setContentText(param.cont); //设置内容    
       param.subTitle&&mNotification.setSubText(param.subTitle);        //子内容暂时去掉    
       // mNotification.setAutoCancel(true);       //设置点击消失    
       //  mNotification.setShowWhen(true);         //显示通知时间    
       mNotification.setTicker("PadInfo");       //弹出通知    
       mNotification.setDefaults(Notification.DEFAULT_ALL);    
       // mNotification.setPriority(Notification.PRIORITY_DEFAULT);   //通知优先级      
       // mNotification.flags=Notification.FLAG_ONLY_ALERT_ONCE;     //发起通知时震动      
       mNotification.setContentIntent(pendingIntent);      

       this.mNotificationBuild = mNotification.build();  
       if (firstVersionNumber>= 8){      
         this.NotifiService.notify(this.channelID, this.NotifyID, this.mNotificationBuild);        
       } else {      
         this.NotifiService.notify(this.NotifyID, this.mNotificationBuild);      
       }   
       if(param.callBack) {  
          this.main&&this.receiver&&this.main.unregisterReceiver(this.receiver);   
          this.receiver = this.receiver ? this.receiver : plus.android.implements('io.dcloud.android.content.BroadcastReceiver', {    
            onReceive: function(context, intent) { //实现onReceiver回调函数    
              param.callBack(intent.getAction().replace(UNI_MEDIA_BROAD + '.',''));    
            }    
          });   
        var IntentFilter = plus.android.importClass('android.content.IntentFilter');    
        var filter = new IntentFilter();    
        filter.addAction(UNI_MEDIA_BROAD + '.prev');  
        filter.addAction(UNI_MEDIA_BROAD + '.play');  
        filter.addAction(UNI_MEDIA_BROAD + '.next');  
        this.main.unregisterReceiver(this.receiver);  
        this.main.registerReceiver(this.receiver, filter); //注册监听    
        this.mediaBtn = uni.requireNativePlugin('uniMediaButton');  // 监听线控  需要配合附件中的插件( Android API >= 26)  
        this.mediaBtn.initMediaButton(res => {  
           console.log(res.message);  
          // 绑定失败/销毁  
          if(res.code == '-1') {  
            this.mediaBtn = null;  
            return;  
          }  
           // res.keyAction == 1 按键松开 res.keyAction == 0 按键按下 播放按钮肯能只有按下  
          if(res.keyCode && res.keyAction == '0') {  
            switch (res.keyCode){  
              case 88:  
                param.callBack(  
                  'prev'  
                );  
                break;  
              case 87:  
                param.callBack(  
                  'next'  
                );  
                break;  
              case 127:  
              case 126:  
                param.callBack(  
                  'play'  
                );  
                break;  
            }  
          }  
        });  
        var serv = plus.android.importClass("android.app.Service");  
        this.serv = this.serv ? this.serv : new serv();  
        this.serv.startForeground(this.NotifyID, this.mNotificationBuild);  
        plus.android.autoCollection(serv);  
        plus.android.autoCollection(IntentFilter);  
       }  
      plus.android.autoCollection(Context);  
      plus.android.autoCollection(BitmapFactory);  
      plus.android.autoCollection(NotificationManager);  
      plus.android.autoCollection(Notification);  
      plus.android.autoCollection(Intent);  
      plus.android.autoCollection(PendingIntent);  
      plus.android.autoCollection(androidR);  
      plus.android.autoCollection(this.receiver);  

    }catch(e){  
      console.log(e);  
    }  
  }  
};

使用方法

// 开启 - 更新标题/播放(暂停)按钮  
show();  
function show(){  
    androidNotifi.showNotifi({  
        title : '通知标题',  
        subTitle: '通知小标题',  
        cont : '通知内容',  
        isPlay: true, // 媒体播放按钮状态(控制播放/暂停按钮样式)  
        legIcon : '', // 封面图片  
        Ongoing : false,    // 是否可删除  
        callBack:function(res){  
            switch (res){  
            case 'play':  
        console.log('play');  
        break;  
        case 'prev':  
        console.log('prev');  
        break;  
        case 'next':  
        console.log('next');  
        break;  
        }  
        }  
    })  
}  
// 关闭  
function hide(){  
    androidNotifi.hideNotifi();  
}  

由于Android播放视频没有通知栏控制.开始一直使用XZH-musicNotification 的插件,但是由于版本更新,出现BUG(插件已更新).
但是不能总等插件更新,就自己动动手写了一个Native.js版本,由于手上设备不多,没有测试更多的兼容性.在这里希望大家能勇于使用修改提出问题,完善此通知提示!
附件是线控耳机、蓝牙耳机按键监听插件(API >= 26,X86好像不支持忘了)

收起阅读 »

银联云闪付小程序开发

云闪付小程序

分享一下我们开发的云闪付小程序PHP后端开发包,unionpay 云闪付小程序开发包

银联云闪付小程序非官方开发包,这可能是第一个支持composer导入的云闪付小程序开发包,小程序后端相关接口与支付相关接口已全部更新完毕。

码云地址:https://gitee.com/leapy/unionpay
Github地址:https://github.com/ileapy/unionpay

vue前端开发包(不建议这样引用)

> npm install upsdk-vue

有需要公众号和小程序开发的可以联系我,我们有团队:

邮箱:cfn@leapy.cn
微信:SH-CFN

继续阅读 »

分享一下我们开发的云闪付小程序PHP后端开发包,unionpay 云闪付小程序开发包

银联云闪付小程序非官方开发包,这可能是第一个支持composer导入的云闪付小程序开发包,小程序后端相关接口与支付相关接口已全部更新完毕。

码云地址:https://gitee.com/leapy/unionpay
Github地址:https://github.com/ileapy/unionpay

vue前端开发包(不建议这样引用)

> npm install upsdk-vue

有需要公众号和小程序开发的可以联系我,我们有团队:

邮箱:cfn@leapy.cn
微信:SH-CFN

收起阅读 »

在uniapp中使用Native.js 使用字节流读写文件工具类封装

/**

  • @description: gpb文件读写工具 采用Native.js
  • @author: Marco
  • @email: wtz_xupt@126.com
    */
    export default class GpbFileUtil {
    /**

    • 单例模式 获取实例
      */
      static getIntance(){
      if(!GpbFileUtil.instance){
      GpbFileUtil.instance = new GpbFileUtil()
      }

      return GpbFileUtil.instance
      }

      /**

    • 构造函数
      */
      constructor(){
      this.init()
      }

      /**

    • 初始化
      */
      init(){
      //导入类需要时间,统一导入提高效率
      this.main = plus.android.runtimeMainActivity()
      this.Environment = plus.android.importClass('android.os.Environment')
      this.File = plus.android.importClass('java.io.File')
      this.FileInputStream = plus.android.importClass("java.io.FileInputStream")
      this.FileOutputStream = plus.android.importClass('java.io.FileOutputStream')
      }

      /**

    • 判断有没有插入sdcard
      */
      checkSDCardExist(){
      if(this.Environment.getExternalStorageState() !== this.Environment.MEDIA_MOUNTED){
      return false
      }
      return true
      }

      /**

    • 获取sdcard根路径
      */
      getSDCardRoot(){
      return this.Environment.getExternalStorageDirectory()
      }

      /**

    • 判断sdcard 文件是否存在
    • @param {Object} filePath
    • @param {Object} fileName
      */
      checkSDCardFileExist(filePath,fileName){
      let fileFullPath = this.getSDCardRoot() + this.File.separator + filePath + this.File.separator + fileName
      let file = new this.File(fileFullPath)
      return file.exists()
      }

      /**

    • 删除sdcard中的文件
    • @param {Object} filePath 文件路径
    • @param {Object} fileName 文件名称
      */
      deleteSDCardFile(filePath,fileName){
      let fileFullPath = this.getSDCardRoot() + this.File.separator + filePath + this.File.separator + fileName

       let file = new this.File(fileFullPath)  
       if(file.exists()){  
           file.delete()  
       }  

      }

      /**

    • 读取sdcard中文件内容
    • @param {Object} filePath 文件路径
    • @param {Object} fileName 文件名称
      */
      readFileFromSDCard(filePath,fileName){
      if(!this.checkSDCardFileExist(filePath,fileName)){
      plus.nativeUI.toast(fileName + '文件不存在!')
      return;
      }
      let fileFullPath = this.getSDCardRoot() + this.File.separator + filePath + this.File.separator + fileName

      let file = new this.File(fileFullPath)

      let fis = new this.FileInputStream(file)

      let bytes = new Uint8Array(fis.available())
      try{
      let index = 0
      let byte
      while((byte = fis.read()) !== -1){
      bytes[index] = byte
      ++index
      }

      }catch(e){
      //TODO handle the exception
      console.log('读取sd文件' + fileName + '失败:' + e.message)
      }finally{
      try{
      if(fis !== null){
      fis.close()
      }
      }catch(ex){
      //TODO handle the exception
      console.log('关闭文件输入流失败:' + ex.message)
      }
      }

      return bytes
      }

      /**

    • 向sdcard中写文件
    • @param {Object} filePath 文件路径
    • @param {Object} fileName 文件名称
    • @param {Object} fileContentBytes 文件内容字节数组
      */
      writeFileToSDCard(filePath,fileName,fileContentBytes){
      this.deleteSDCardFile()
      let fileFullPath = this.getSDCardRoot() + this.File.separator + filePath + this.File.separator + fileName
      let file = new this.File(fileFullPath)
      let fos = new this.FileOutputStream(file)
      try{
      let index = 0
      while(index < fileContentBytes.length){
      fos.write(fileContentBytes[index])
      ++index
      }
      //fos.write(fileContentBytes) //java byte数组在nativejs中写入不了,只能循环一个一个字节写入
      fos.flush()
      }catch(e){
      //TODO handle the exception
      console.log('写入sd文件' + fileName + '失败:' + e.message)
      }finally{
      try{
      if(fos !== null){
      fos.close()
      }
      }catch(ex){
      //TODO handle the exception
      console.log('关闭文件输出流失败:' + ex.message)
      }
      }
      }

    }

在测试过程中nativejs 调用java FileInputStream read(byte []) 和write(byte []) 读取和写入不了。尝试循环后每次读取或写入一个字节成功了。

继续阅读 »

/**

  • @description: gpb文件读写工具 采用Native.js
  • @author: Marco
  • @email: wtz_xupt@126.com
    */
    export default class GpbFileUtil {
    /**

    • 单例模式 获取实例
      */
      static getIntance(){
      if(!GpbFileUtil.instance){
      GpbFileUtil.instance = new GpbFileUtil()
      }

      return GpbFileUtil.instance
      }

      /**

    • 构造函数
      */
      constructor(){
      this.init()
      }

      /**

    • 初始化
      */
      init(){
      //导入类需要时间,统一导入提高效率
      this.main = plus.android.runtimeMainActivity()
      this.Environment = plus.android.importClass('android.os.Environment')
      this.File = plus.android.importClass('java.io.File')
      this.FileInputStream = plus.android.importClass("java.io.FileInputStream")
      this.FileOutputStream = plus.android.importClass('java.io.FileOutputStream')
      }

      /**

    • 判断有没有插入sdcard
      */
      checkSDCardExist(){
      if(this.Environment.getExternalStorageState() !== this.Environment.MEDIA_MOUNTED){
      return false
      }
      return true
      }

      /**

    • 获取sdcard根路径
      */
      getSDCardRoot(){
      return this.Environment.getExternalStorageDirectory()
      }

      /**

    • 判断sdcard 文件是否存在
    • @param {Object} filePath
    • @param {Object} fileName
      */
      checkSDCardFileExist(filePath,fileName){
      let fileFullPath = this.getSDCardRoot() + this.File.separator + filePath + this.File.separator + fileName
      let file = new this.File(fileFullPath)
      return file.exists()
      }

      /**

    • 删除sdcard中的文件
    • @param {Object} filePath 文件路径
    • @param {Object} fileName 文件名称
      */
      deleteSDCardFile(filePath,fileName){
      let fileFullPath = this.getSDCardRoot() + this.File.separator + filePath + this.File.separator + fileName

       let file = new this.File(fileFullPath)  
       if(file.exists()){  
           file.delete()  
       }  

      }

      /**

    • 读取sdcard中文件内容
    • @param {Object} filePath 文件路径
    • @param {Object} fileName 文件名称
      */
      readFileFromSDCard(filePath,fileName){
      if(!this.checkSDCardFileExist(filePath,fileName)){
      plus.nativeUI.toast(fileName + '文件不存在!')
      return;
      }
      let fileFullPath = this.getSDCardRoot() + this.File.separator + filePath + this.File.separator + fileName

      let file = new this.File(fileFullPath)

      let fis = new this.FileInputStream(file)

      let bytes = new Uint8Array(fis.available())
      try{
      let index = 0
      let byte
      while((byte = fis.read()) !== -1){
      bytes[index] = byte
      ++index
      }

      }catch(e){
      //TODO handle the exception
      console.log('读取sd文件' + fileName + '失败:' + e.message)
      }finally{
      try{
      if(fis !== null){
      fis.close()
      }
      }catch(ex){
      //TODO handle the exception
      console.log('关闭文件输入流失败:' + ex.message)
      }
      }

      return bytes
      }

      /**

    • 向sdcard中写文件
    • @param {Object} filePath 文件路径
    • @param {Object} fileName 文件名称
    • @param {Object} fileContentBytes 文件内容字节数组
      */
      writeFileToSDCard(filePath,fileName,fileContentBytes){
      this.deleteSDCardFile()
      let fileFullPath = this.getSDCardRoot() + this.File.separator + filePath + this.File.separator + fileName
      let file = new this.File(fileFullPath)
      let fos = new this.FileOutputStream(file)
      try{
      let index = 0
      while(index < fileContentBytes.length){
      fos.write(fileContentBytes[index])
      ++index
      }
      //fos.write(fileContentBytes) //java byte数组在nativejs中写入不了,只能循环一个一个字节写入
      fos.flush()
      }catch(e){
      //TODO handle the exception
      console.log('写入sd文件' + fileName + '失败:' + e.message)
      }finally{
      try{
      if(fos !== null){
      fos.close()
      }
      }catch(ex){
      //TODO handle the exception
      console.log('关闭文件输出流失败:' + ex.message)
      }
      }
      }

    }

在测试过程中nativejs 调用java FileInputStream read(byte []) 和write(byte []) 读取和写入不了。尝试循环后每次读取或写入一个字节成功了。

收起阅读 »

Android平台各功能模块隐私合规协议

合规条款 隐私协议 合规

请根据App集成的功能模块补充相应模块的隐私协议

uni-app(5+、web2app)

<table style="word-break:break-all">
<tr>
<th style="width:10%">SDK名称</th>
<th style="width:10%">包名信息</th>
<th style="width:15%">使用目的</th>
<th style="width:30%">使用的权限</th>
<th style="width:15%">涉及个人信息</th>
<th style="width:10%">隐私权政策链接/官网</th>
</tr>
<tr>
<td>uni-app(5+、web2app)</td>
<td>io.dcloud</td>
<td>基础模块</td>
<td style="font-size:12px">
android.permission.INTERNET<br>
android.permission.ACCESS_NETWORK_STATE<br>
android.permission.WRITE_EXTERNAL_STORAGE<br>
android.permission.READ_EXTERNAL_STORAG<br>
android.permission.READ_PHONE_STATE
</td>
<td>存储的个人文件,设备信息(IMEI、ANDROID_ID、DEVICE_ID、IMSI),网络信息</td>
<td><a href="https://dcloud.io/license/appprivacy.html" target="_blank">https://dcloud.io/license/appprivacy.html</a></td>
</tr>
</table>

注意

  • 基础模块使用的权限说明及权限删减配置请参考文章Android平台云端打包权限配置
  • 离线打包请自行在AndroidManifest.xml中删减权限。
  • 关于READ_PHONE_STATE权限申请可根据权限策略文档配置屏蔽权限申请行为,具体请认真阅读文档!

uni-app默认集成功能模块

<table style="word-break:break-all">
<tr>
<th style="width:10%">SDK名称</th>
<th style="width:10%">包名信息</th>
<th style="width:15%">使用目的</th>
<th style="width:30%">使用的权限</th>
<th style="width:15%">涉及个人信息</th>
<th style="width:10%">隐私权政策链接/官网</th>
</tr>
<tr>
<td>阿里weexSDK</td>
<td>com.taobao</td>
<td>uni-app基础模块默认集成,用于渲染uniapp的nvue页面引擎</td>
<td style="font-size:12px">
android.permission.WRITE_EXTERNAL_STORAGE<br>
android.permission.READ_EXTERNAL_STORAG
</td>
<td>存储的个人文件</td>
<td><a href="https://weexapp.com/zh/" target="_blank">https://weexapp.com/zh/</a></td>
</tr>
<tr>
<td>Fresco图库</td>
<td>com.facebook.fresco</td>
<td>用于nvue页面加载图片使用</td>
<td style="font-size:12px">
android.permission.WRITE_EXTERNAL_STORAGE<br>
android.permission.READ_EXTERNAL_STORAG
</td>
<td>存储的个人文件</td>
<td><a href="https://www.fresco-cn.org/" target="_blank">https://www.fresco-cn.org/</a></td>
</tr>
<tr>
<td>glide图库</td>
<td>com.bumptech.glide</td>
<td>用于图片预览使用</td>
<td style="font-size:12px">
android.permission.WRITE_EXTERNAL_STORAGE<br>
android.permission.READ_EXTERNAL_STORAG
</td>
<td>存储的个人文件</td>
<td><a href="http://bumptech.github.io/glide/" target="_blank">http://bumptech.github.io/glide/</a></td>
</tr>
<tr>
<td>gif-drawable</td>
<td>pl.droidsonroids.gif</td>
<td>加载gif图</td>
<td style="font-size:12px">
android.permission.WRITE_EXTERNAL_STORAGE<br>
android.permission.READ_EXTERNAL_STORAG
</td>
<td>存储文件</td>
<td><a href="https://github.com/alibaba/fastjson" target="_blank">https://github.com/koral--/android-gif-drawable</a></td>
</tr>
<tr>
<td>fastjson</td>
<td>com.alibaba.fastjson</td>
<td>JSON解析</td>
<td style="font-size:12px">

</td>
<td>无</td>
<td><a href="https://github.com/alibaba/fastjson" target="_blank">https://github.com/alibaba/fastjson</a></td>
</tr>
<tr>
<td>移动安全联盟 OAID</td>
<td>com.bun.miitmdid、com.zui.opendeviceidlibrary、com.netease.nis、com.samsung.android、com.huawei.hms</td>
<td>获取oaid</td>
<td style="font-size:12px">

</td>
<td>设备信息</td>
<td><a href="http://www.msa-alliance.cn/col.jsp?id=122" target="_blank">http://www.msa-alliance.cn/col.jsp?id=122</a></td>
</tr>
</table>

关于移动安全联盟 OAID

移动智能终端补充设备标识体系与 SDK 隐私合规问题

移动智能终端补充设备标识体系与 SDK 严格遵守我国《网络安全法》、《数据安全法》和《电信和互联网用户个人信息保护规定》等相关法律法规和《信息安全技术 个人信息安全规范》等国家标准要求。SDK 不会主动收集任何数据,只在 APP 调用时获取以下数据,用于本地判断,不会进行任何网络传输:
­

  • 设备制造商、设备型号、设备品牌,用于判断终端调用接口
  • 设备网络运营商名称,用于判断虚拟机环境
  • APP 包名,用于校验签名

UniPush

<a id="push"></a>

UniPush是DCloud联合个推公司推出的集成型统一推送服务,使用了个推提供的SDK,因此需要在《隐私政策》中添加“个推消息推送SDK”相关说明。
建议《隐私政策》添加 “与授权合作伙伴共享”条款中,将 个推的用户隐私政策 加入其中,并向终端用户逐一明示您嵌入的SDK收集使用个人信息的目的、方式和范围。参考内容如下:

UniPush模块集成的三方SDK说明

<table style="word-break:break-all">
<tr>
<th style="width:10%">SDK名称</th>
<th style="width:10%">包名信息</th>
<th style="width:15%">使用目的</th>
<th style="width:30%">使用的权限</th>
<th style="width:20%">涉及个人信息</th>
<th style="width:10%">隐私权政策链接</th>
</tr>
<tr>
<td>个推·消息推送</td>
<td>com.igexin</td>
<td>消息推送(请根据具体使用目的填写)</td>
<td style="font-size:12px">
android.permission.ACCESS_NETWORK_STATE<br>
android.permission.ACCESS_WIFI_STATE<br>
android.permission.READ_PHONE_STATE<br>
android.permission.WRITE_EXTERNAL_STORAGE<br>
android.permission.VIBRATE<br>
android.permission.GET_TASKS<br>
android.permission.QUERY_ALL_PACKAGES
</td>
<td>存储的个人文件、设备信息、网络信息(必选信息:设备平台、设备厂商、设备品牌、设备型号及系统版本、OAID、AndroidID、WIFI连接信息(SSID、BSSID)、运营商信息、DHCP;可选信息:IMEI、MAC、Google Advertising ID(GAID)、Serial Number、IMSI、ICCID、IP地址、基站信息)、位置相关信息、已安装应用列表</td>
<td><a href="http://docs.getui.com/privacy" target="_blank">http://docs.getui.com/privacy</a></td>
</tr>
</table>

注意:unipush 配置了华为厂商推送,需要添加HMS相关隐私协议 需要注意

HMS push

推送服务(Push Kit)是华为提供的消息推送平台,建立了从云端到终端的消息推送通道。您通过集成推送服务,可以向客户端应用实时推送消息,因此需要在《隐私政策》中添加"HMS push"相关说明。

<table style="word-break:break-all">
<tr>
<th style="width:10%">SDK名称</th>
<th style="width:10%">包名信息</th>
<th style="width:15%">使用目的</th>
<th style="width:30%">使用的权限</th>
<th style="width:20%">涉及个人信息</th>
<th style="width:10%">隐私权政策链接</th>
</tr>
<tr>
<td>华为 HMS push</td>
<td>com.huawei.hms</td>
<td>华为手机厂商推送(请根据具体使用目的填写)</td>
<td style="font-size:12px">
android.permission.ACCESS_NETWORK_STATE<br>
android.permission.ACCESS_WIFI_STATE<br>
android.permission.REQUEST_INSTALL_PACKAGES<br>
android.permission.FOREGROUND_SERVICE<br>
android.permission.READ_PHONE_STATE
</td>
<td>设备信息(IMEI、ANDROID_ID、DEVICE_ID、IMSI)、应用已安装列表、网络信息</td>
<td><a href="https://developer.huawei.com/consumer/cn/doc/HMSCore-Guides/sdk-data-security-0000001050042177" target="_blank">推送隐私声明</a></td>
</tr>
</table>

魅族 Flyme push

魅族推送服务是由魅族公司为开发者提供的消息推送服务,开发者可以向集成了魅族pushSDK的客户端实时地推送通知或者消息,与用户保持互动,提高活跃率,因此需要在《隐私政策》中添加"Flyme push"相关说明。

<table style="word-break:break-all">
<tr>
<th style="width:10%">SDK名称</th>
<th style="width:10%">包名信息</th>
<th style="width:15%">使用目的</th>
<th style="width:30%">使用的权限</th>
<th style="width:20%">涉及个人信息</th>
<th style="width:10%">隐私权政策链接</th>
</tr>
<tr>
<td>魅族 Flyme push</td>
<td>com.meizu.cloud</td>
<td>魅族手机厂商推送(请根据具体使用目的填写)</td>
<td style="font-size:12px">
android.permission.INTERNET<br>
android.permission.ACCESS_NETWORK_STATE<br>
android.permission.READ_EXTERNAL_STORAGE<br>
android.permission.WRITE_EXTERNAL_STORAGE
</td>
<td>网络信息、存储的个人文件</td>
<td><a href="http://static.meizu.com/resources/term/privacy8.html" target="_blank">推送隐私声明</a></td>
</tr>
</table>

OPPO push

推送服务(OPPO PUSH)是OPPO公司向开发者提供的消息推送服务,通过服务端与OS端建立的一条稳定、可靠的长连接通道,向OPPO手机系统(ColorOS)上的APP应用客户端实时推送消息的服务。无论应用进程是否存在,均可正常收到消息。因此需要在《隐私政策》中添加"OPPO push"相关说明。

<table style="word-break:break-all">
<tr>
<th style="width:10%">SDK名称</th>
<th style="width:10%">包名信息</th>
<th style="width:15%">使用目的</th>
<th style="width:30%">使用的权限</th>
<th style="width:20%">涉及个人信息</th>
<th style="width:10%">隐私权政策链接</th>
</tr>
<tr>
<td>OPPO push</td>
<td>com.heytap</td>
<td>OPPO手机厂商推送(请根据具体使用目的填写)</td>
<td style="font-size:12px">
android.permission.INTERNET<br>
android.permission.ACCESS_NETWORK_STATE<br>
android.permission.ACCESS_WIFI_STATE
</td>
<td>网络信息</td>
<td><a href="https://open.oppomobile.com/new/developmentDoc/info?id=10288" target="_blank">推送隐私声明</a></td>
</tr>
</table>

vivo push

vivo推送(即Vpush)是vivo公司向开发者提供的消息推送服务,通过在云端与客户端之间建立一条稳定、可靠的长连接,为开发者提供向客户端应用实时推送消息的服务,支持百亿级的通知/消息推送,秒级触达移动用户,因此需要在《隐私政策》中添加"vivo push"相关说明。

<table style="word-break:break-all">
<tr>
<th style="width:10%">SDK名称</th>
<th style="width:10%">包名信息</th>
<th style="width:15%">使用目的</th>
<th style="width:30%">使用的权限</th>
<th style="width:20%">涉及个人信息</th>
<th style="width:10%">隐私权政策链接</th>
</tr>
<tr>
<td>vivo push</td>
<td>com.vivo.push</td>
<td>vivo手机厂商推送(请根据具体使用目的填写)</td>
<td style="font-size:12px">
android.permission.INTERNET
</td>
<td>网络信息</td>
<td><a href="https://dev.vivo.com.cn/documentCenter/doc/652#w1-12075822" target="_blank">推送隐私声明</a></td>
</tr>
</table>

小米 MiPush

小米推送(MiPush)是小米公司向开发者提供的消息推送服务,通过在云端与客户端之间建立一条稳定、可靠的长连接,为开发者提供向客户端应用实时推送消息的服务,有效地帮助开发者触达用户,提升App活跃度,因此需要在《隐私政策》中添加"小米 push"相关说明。

<table style="word-break:break-all">
<tr>
<th style="width:10%">SDK名称</th>
<th style="width:10%">包名信息</th>
<th style="width:15%">使用目的</th>
<th style="width:30%">使用的权限</th>
<th style="width:20%">涉及个人信息</th>
<th style="width:10%">隐私权政策链接</th>
</tr>
<tr>
<td>MiPush</td>
<td>com.xiaomi.push</td>
<td>小米手机厂商推送(请根据具体使用目的填写)</td>
<td style="font-size:12px">
android.permission.INTERNET<br>
android.permission.ACCESS_NETWORK_STATE<br>
android.permission.VIBRATE
</td>
<td>网络信息</td>
<td><a href="https://dev.mi.com/distribute/doc/details?pId=1534" target="_blank">推送隐私声明</a></td>
</tr>
</table>

Statistic

<a id="statistic"></a>

HX3.1.14+ 友盟SDK已升级到9.3.8版本 适配合规问题

  • 当你集成了统计模块。您需要确保App有《隐私政策》,并且在用户首次启动App时就弹出《隐私政策》取得用户同意!!!
  • 您务必告知用户您选择友盟+SDK服务,请在《隐私政策》中增加如下参考条款:“我们的产品集成友盟+SDK,友盟+SDK需要收集您的设备Mac地址、唯一设备识别码(IMEI/android ID/IDFA/OPENUDID/GUID、SIM 卡 IMSI 信息)以提供统计分析服务,并通过地理位置校准报表数据准确性,提供基础反作弊能力。”
  • 您务必确保用户同意《隐私政策》之后。再调用相关api!!!!

Statistic模块集成的三方SDK说明

<table style="word-break:break-all">
<tr>
<th style="width:10%">SDK名称</th>
<th style="width:10%">包名信息</th>
<th style="width:15%">使用目的</th>
<th style="width:30%">使用的权限</th>
<th style="width:20%">涉及个人信息</th>
<th style="width:10%">隐私权政策链接</th>
</tr>
<tr>
<td>友盟统计</td>
<td>com.uc.crashsdk、com.efs、com.umeng</td>
<td>统计(请根据具体使用目的填写)</td>
<td style="font-size:12px">
android.permission.ACCESS_NETWORK_STATE<br>
android.permission.ACCESS_WIFI_STATE<br>
android.permission.READ_PHONE_STATE
</td>
<td>设备信息(IMEI、ANDROID_ID、DEVICE_ID、IMSI)、应用已安装列表、网络信息</td>
<td><a href="https://www.umeng.com/page/policy" target="_blank">https://www.umeng.com/page/policy</a></td>
</tr>
</table>

OAuth、Share、Payment

<a id="oauth"/>
<a id="payment"/>
<a id="share"/>
登录、分享、支付存在引入相同SDK,这里统一进行说明:

<table style="word-break:break-all">
<tr>
<th style="width:10%">SDK名称</th>
<th style="width:10%">包名信息</th>
<th style="width:15%">使用目的</th>
<th style="width:30%">使用的权限</th>
<th style="width:20%">涉及个人信息</th>
<th style="width:10%">隐私权政策链接</th>
</tr>
<tr>
<td>微信开放平台</td>
<td>com.tencent.mm</td>
<td>登录、分享、支付(请根据具体使用目的填写)</td>
<td style="font-size:12px">
android.permission.ACCESS_NETWORK_STATE<br>
android.permission.ACCESS_WIFI_STATE
</td>
<td>存储的个人文件、网络信息</td>
<td><a href="https://weixin.qq.com/cgi-bin/readtemplate?lang=zh_CN&t=weixin_agreement&s=privacy" target="_blank">微信隐私协议</a></td>
</tr>
<tr>
<td>新浪开放平台</td>
<td>com.sina.weibo</td>
<td>登录、分享(请根据具体使用目的填写)</td>
<td style="font-size:12px">
android.permission.ACCESS_NETWORK_STATE<br>
android.permission.ACCESS_WIFI_STATE
</td>
<td>存储的个人文件、网络信息</td>
<td><a href="https://weibo.com/signup/v5/privacy?spm=a1zaa.8161610.0.0.4f8776217Wu8R1" target="_blank">新浪隐私协议</a></td>
</tr>
<tr>
<td>QQ开放平台</td>
<td>com.tencent.open</td>
<td>登录、分享(请根据具体使用目的填写)</td>
<td style="font-size:12px">
android.permission.MODIFY_AUDIO_SETTINGS<br>
android.permission.ACCESS_NETWORK_STATE<br>
android.permission.ACCESS_WIFI_STATE
</td>
<td>存储的个人文件、读取手机状态和身份、网络信息</td>
<td><a href="https://wiki.connect.qq.com/qq%e4%ba%92%e8%81%94sdk%e9%9a%90%e7%a7%81%e4%bf%9d%e6%8a%a4%e5%a3%b0%e6%98%8e" target="_blank">qq隐私协议</a></td>
</tr>
<tr>
<td>支付宝开放平台</td>
<td>com.alipay</td>
<td>支付(请根据具体使用目的填写)</td>
<td style="font-size:12px">
android.permission.ACCESS_NETWORK_STATE<br>
android.permission.ACCESS_WIFI_STATE
</td>
<td>网络信息 设备id IP地址 OAID IMSI</td>
<td><a href="https://render.alipay.com/p/c/k2cx0tg8" target="_blank">支付宝隐私协议</a></td>
</tr>
</table>

一键登录

<table style="word-break:break-all">
<tr>
<th style="width:10%">SDK名称</th>
<th style="width:10%">包名信息</th>
<th style="width:15%">使用目的</th>
<th style="width:30%">使用的权限</th>
<th style="width:20%">涉及个人信息</th>
<th style="width:10%">隐私权政策链接</th>
</tr>
<tr>
<td>个验一键登录</td>
<td>com.g.elogin、com.g.gysdk、cn.com.chinatelecom</td>
<td>登录(请根据具体使用目的填写)</td>
<td style="font-size:12px">
android.permission.READ_PHONE_STATE<br>
android.permission.READ_EXTERNAL_STORAGE<br>
android.permission.WRITE_EXTERNAL_STORAGE<br>
android.permission.ACCESS_NETWORK_STATE<br>
android.permission.ACCESS_WIFI_STATE<br>
android.permission.CHANGE_NETWORK_STATE
</td>
<td>设备信息、网络信息(必选信息:设备平台、设备厂商、设备品牌、设备型号及系统版本、OAID、AndroidID、WIFI连接信息(SSID、BSSID)、运营商信息、DHCP、IP地址、去标识化的手机号码;可选信息:IMEI、MAC、Google Advertising ID(GAID)、Serial Number、IMSI、ICCID、基站信息)、存储的个人文件、读取手机状态和身份、位置相关信息、已安装应用列表</td>
<td> <a href="https://docs.getui.com/privacy/" target="_blank">个验</a> <br><a href="https://wap.cmpassport.com/resources/html/contract.html" target="_blank">中国移动认证服务条款</a><br>
<a href="https://opencloud.wostore.cn/authz/resource/html/disclaimer.html?fromsdk=true" target="_blank">联通统一认证服务条款</a>
</td>
</tr>
</table>

一键登录包含以下登录认证需要在隐私协议中补充

Speech

<a id="speech"/>
Speech模块集成的三方SDK说明

百度语音

<table style="word-break:break-all">
<tr>
<th style="width:10%">SDK名称</th>
<th style="width:10%">包名信息</th>
<th style="width:15%">使用目的</th>
<th style="width:30%">使用的权限</th>
<th style="width:20%">涉及个人信息</th>
<th style="width:10%">隐私权政策链接</th>
</tr>
<tr>
<td>百度语音识别</td>
<td>com.baidu.speech</td>
<td>语音识别(请根据具体使用目的填写)</td>
<td style="font-size:12px">
android.permission.RECORD_AUDIO<br>
android.permission.ACCESS_NETWORK_STATE<br>
android.permission.ACCESS_WIFI_STATE<br>
android.permission.CHANGE_NETWORK_STATE<br>
android.permission.READ_PHONE_STATE<br>
android.permission.WRITE_EXTERNAL_STORAGE
</td>
<td>存储的个人文件、读取手机状态和身份、网络信息</td>
<td><a href="https://ai.baidu.com/ai-doc/REFERENCE/Qkdykq1r3" target="_blank">https://ai.baidu.com/ai-doc/REFERENCE/Qkdykq1r3</a></td>
</tr>
</table>

Map & Geolocation

<a id="map-amp-geolocation"/>
Map & Geolocation模块集成的三方SDK说明

<table style="word-break:break-all">
<tr>
<th style="width:10%">SDK名称</th>
<th style="width:10%">包名信息</th>
<th style="width:15%">使用目的</th>
<th style="width:30%">使用的权限</th>
<th style="width:20%">涉及个人信息</th>
<th style="width:10%">隐私权政策链接</th>
</tr>
<tr>
<td>高德开放平台</td>
<td>com.amap.api, com.loc, com.autonavi</td>
<td>实现定位/展现地图(请根据具体使用目的填写)</td>
<td style="font-size:12px">
android.permission.ACCESS_COARSE_LOCATION<br>
android.permission.ACCESS_FINE_LOCATION<br>
android.permission.ACCESS_NETWORK_STATE<br>
android.permission.ACCESS_WIFI_STATE<br>
android.permission.CHANGE_WIFI_STATE<br>
android.permission.READ_PHONE_STATE<br>
android.permission.WRITE_EXTERNAL_STORAGE<br>
android.permission.ACCESS_LOCATION_EXTRA_COMMANDS
</td>
<td>存储的个人文件、位置信息、读取手机状态和身份、网络信息、传感器信息、Android ID</td>
<td><a href="https://lbs.amap.com/pages/privacy/" target="_blank">https://lbs.amap.com/pages/privacy/</a></td>
</tr>
<tr>
<td>百度开放平台</td>
<td>com.baidu</td>
<td>实现定位/展现地图(请根据具体使用目的填写)</td>
<td style="font-size:12px">
android.permission.ACCESS_COARSE_LOCATION<br>
android.permission.ACCESS_FINE_LOCATION<br>
android.permission.ACCESS_NETWORK_STATE<br>
android.permission.ACCESS_WIFI_STATE<br>
android.permission.CHANGE_WIFI_STATE<br>
android.permission.READ_PHONE_STATE<br>
android.permission.WRITE_EXTERNAL_STORAGE<br>
android.permission.ACCESS_LOCATION_EXTRA_COMMANDS<br>
android.permission.READ_LOGS<br>
android.permission.WRITE_SETTINGS<br>
android.permission.MOUNT_UNMOUNT_FILESYSTEM
</td>
<td>存储的个人文件、位置信息、读取手机状态和身份、网络信息</td>
<td><a href="https://map.baidu.com/zt/client/privacy/index.html" target="_blank">https://map.baidu.com/zt/client/privacy/index.html</a></td>
</tr>
</table>

注意

  • 关于高德SDK在后台收集个人信息的问题,请在《隐私政策》中参考补充如下条款:我们的产品集成了高德SDK,应用在后台状态下高德SDK可能会收集设备标识信息(Android ID)以支持在后台继续提供相关服务。

uni-ad

<a id="uniAd"/>

uni-ad广告模块集成的三方SDK说明

<table style="word-break:break-all">
<tr>
<th style="width:8%">SDK名称</th>
<th style="width:10%">SDK包名/网址</th>
<th style="width:8%">SDK用途</th>
<th style="width:20%">可能获取的个人信息类型</th>
<th style="width:25%">调用的设备权限</th>
<th style="width:20%">信息用途</th>
<th style="width:10%">SDK隐私政策链接/目的</th>
</tr>
<tr>
<td>uni-ad</td>
<td></td>
<td>基础广告 </td>
<td style="font-size:12px">设备品牌、型号、操作系统版本、OAID、分辨率、IMEI、android ID、SIM 卡 IMSI 信息、应用名称、应用包名、应用版本号、网络信息、应用安装列表、位置信息 </td>
<td style="font-size:12px">
android.permission.ACCESS_NETWORK_STATE <br>
android.permission.READ_PHONE_STATE <br>
android.permission.ACCESS_COARSE_LOCATION
</td>
<td>广告投放合作,广告归因、反作弊、安全 </td>
<td><a href="https://doc.dcloud.net.cn/markdown-share-docs/1d821cdd3cdf2681045ec4be94bc8404/" target="_blank">隐私协议</a></td>
</tr>
<tr>
<td>推啊 </td>
<td> engine.tuifish.com </td>
<td>基础广告 </td>
<td style="font-size:12px">设备品牌、型号、操作系统版本、OAID、分辨率、IMEI、android ID、SIM 卡 IMSI 信息、应用名称、应用包名、应用版本号、网络信息、应用安装列表、位置信息 </td>
<td style="font-size:12px">
android.permission.ACCESS_NETWORK_STATE <br>
android.permission.READ_PHONE_STATE <br>
android.permission.ACCESS_COARSE_LOCATION
</td>
<td style="font-size:12px">识别广告、活动作弊行为;改善 SDK 崩溃率、推送个性化广告;广告投放。 </td>
<td><a href= "https://yun.tuia.cn/tuia/sdk/agreement/index.html" target="_blank">推啊隐私协议</a></td>
</tr>
<tr>
<td>快手 </td>
<td>com.kwad.sdk </td>
<td>增强广告 </td>
<td>基础信息:设备品牌、设备型号、软件系统版本、存储信息、运营商信息、设备时区、设备语言、网络信息等基础信息</br>
设备标识:IMEIs、MEID、OAID、AndroidID、IMSIs、ICCID</br>
位置信息:IP地址、MAC地址、GPS位置信息、基站信息、WIFI信息</br>
应用信息:应用安装列表</br>
其他信息:传感器信息、sim卡激活信息</td>
<td style="font-size:12px">
android.permission.ACCESS_NETWORK_STATE <br>
android.permission.INTERNET <br>
android.permission.READ_PHONE_STATE <br>
android.permission.ACCESS_WIFI_STATE <br>
android.permission.REQUEST_INSTALL_PACKAGES <br>
android.permission.VIBRATE
</td>
<td>广告投放、广告归因、反作弊、安全 </td>
<td><a href="https://www.kuaishou.com/about/policy" target="_blank">快手内容联盟隐私协议</a>和<a href="https://u.kuaishou.com/home/detail/1220" target="_blank">SDK使用规范</a></td>
</tr>
<tr>
<td>快手内容联盟 </td>
<td>com.kwad.sdk </td>
<td>增强广告 </td>
<td>基础信息:设备品牌、设备型号、软件系统版本、存储信息、运营商信息、设备时区、设备语言、网络信息等基础信息</br>
设备标识:IMEIs、MEID、OAID、AndroidID、IMSIs、ICCID</br>
位置信息:IP地址、MAC地址、GPS位置信息、基站信息、WIFI信息</br>
应用信息:应用安装列表</br>
其他信息:传感器信息、sim卡激活信息 </td>
<td style="font-size:12px">
android.permission.ACCESS_NETWORK_STATE <br>
android.permission.INTERNET <br>
android.permission.READ_PHONE_STATE <br>
android.permission.ACCESS_WIFI_STATE <br>
android.permission.REQUEST_INSTALL_PACKAGES <br>
android.permission.VIBRATE <br>
android.permission.SET_WALLPAPER<br>
android.permission.READ_EXTERNAL_STORAGE <br>
android.permission.WRITE_EXTERNAL_STORAGE <br>
android.permission.ACCESS_COARSE_LOCATION <br>
android.permission.BLUETOOTH
</td>
<td>广告投放、广告归因、反作弊、安全 </td>
<td><a href="https://www.kuaishou.com/about/policy" target="_blank">快手内容联盟隐私协议</a>和<a href="https://u.kuaishou.com/home/detail/1220" target="_blank">SDK使用规范</a></td>
</tr>
<tr>
<td>优量汇 </td>
<td>com.qq.e </td>
<td>增强广告 </td>
<td>基站、附近的WIFI、连接的WIFI、位置信息、设备制造商、设备型号、操作系统版本、屏幕分辨率、屏幕方向、屏幕DPI、IP地址、加速度传感器、磁场传感器、OAID、IMEI/MEID(Device ID)、Android_ID、包名、版本号、进程名称、运行状态、可疑行为、应用安装信息 </td>
<td style="font-size:12px">
android.permission.INTERNET <br>
android.permission.ACCESS_NETWORK_STATE <br>
android.permission.ACCESS_WIFI_STATE <br>
android.permission.REQUEST_INSTALL_PACKAGES <br>
android.permission.CHANGE_NETWORK_STATE<br>
android.permission.QUERY_ALL_PACKAGES <br>
android.permission.REORDER_TASKS<br>
android.permission.VIBRATE <br>
android.permission.ACCESS_COARSE_LOCATION
</td>
<td style="font-size:12px">广告投放与监测归因、广告主统计投放结果、减少App崩溃、确保服务器正常运行、提升可扩展性和性能</td>
<td><a href="https://e.qq.com/dev/help_detail.html?cid=2005&pid=5983" target="_blank">优量汇隐私协议</a></td>
</tr>
<tr>
<td>穿山甲 </td>
<td>com.bytedance.sdk.openadsdk</td>
<td>增强广告 </td>
<td>设备品牌、型号、软件系统版本、屏幕密度、屏幕分辨率、设备语言、设备时区、sim卡信息(mcc&mnc)、CPU信息、可用存储空间大小、MAC地址、设备标识符(如IMEI、IMSI、ICCID、GAID(仅GMS服务)、MEID、硬件序列号build_serial、AndroidID、OAID、运营商信息、Wi-Fi状态、网络信号强度、IP地址、应用包名、运行中的进程信息、版本号、应用前后台状态、软件列表信息、线性加速度传感器、磁场传感器、旋转矢量传感器、精确位置信息、粗略位置信息(WiFi列表、WLAN接入点(如SSID,BSSID)、基站) </td>
<td style="font-size:12px">
android.permission.ACCESS_NETWORK_STATE <br>
android.permission.READ_PHONE_STATE <br>
android.permission.WRITE_EXTERNAL_STORAGE
</td>
<td>广告投放合作、广告归因、反作弊 </td>
<td><a href="https://www.pangle.cn/privacy/partner" target="_blank">穿山甲隐私协议</a></td>
</tr>
<tr>
<td>Sigmob </td>
<td>com.sigmob.windad </td>
<td>增强广告 </td>
<td>设备信息:设备品牌、型号、操作系统版本、OAID、分辨率等基础设备信息
应用信息:应用名称、应用包名、应用版本号等
其他:运营商信息、时区</td>
<td style="font-size:12px">
android.permission.ACCESS_NETWORK_STATE<br>
android.permission.INTERNET <br>
android.permission.ACCESS_WIFI_STATE <br>
android.permission.CHANGE_WIFI_STATE <br>
android.permission.READ_PHONE_STATE <br>
android.permission.REQUEST_INSTALL_PACKAGES <br>
android.permission.QUERY_ALL_PACKAGES
</td>
<td>广告投放、广告主归因、反作弊 </td>
<td><a href="https://doc.sigmob.com/Sigmob%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8D%97/%E5%90%88%E8%A7%84%E6%9D%A1%E6%AC%BE/%E9%9A%90%E7%A7%81%E6%94%BF%E7%AD%96/">Sigmob隐私协议</a></td>
</tr>
<tr>
<td>百度百青藤</td>
<td>com.baidu.mobads.proxy </td>
<td>增强广告 </td>
<td>设备信息:设备品牌、型号、软件系统版本、分辨率、网络信号强度、传感器信息,磁盘总空间、系统总内存空间、手机重启信息、手机系统更新时间等基础信息、OAID、AndroidID、屏幕宽高,屏幕像素密度,系统版本号,设备厂商,设备型号,手机运营商,手机网络状态,设备剩余存储空间,手机重启时间和更新时间
开发者应用信息:应用包名、应用前后台状态
设备信息:IMEI、IMSI、MEID
位置信息</td>
<td style="font-size:12px">
android.permission.INTERNET<br>
android.permission.ACCESS_NETWORK_STATE<br>
android.permission.ACCESS_WIFI_STATE<br>
android.permission.READ_PHONE_STATE<br>
android.permission.ACCESS_COARSE_LOCATION<br>
android.permissio.WRITE_EXTERNAL_STORAGE<br>
</td>
<td>为最终用户提供安全保障、改善我们的产品和服务,开展内部审计、数据分析和研究 </td>
<td><a href="https://union.baidu.com/bqt/#/legal/policies">百度百青藤隐私协议</a></td>
</tr>

<tr>
<td>HUAWEI Ads</td>
<td>com.huawei.hms.ads.lite</td>
<td>增强广告 </td>
<td>设备信息、网络信息、位置信息、应用信息、应用使用信息、上下文信息</td>
<td style="font-size:12px">
android.permission.INTERNET<br>
android.permission.ACCESS_NETWORK_STATE<br>
android.permission.ACCESS_WIFI_STATE<br>
</td>
<td>单次请求的广告定向投放、程序化广告投放、广告监测归因与反作弊。</td>
<td><a href="https://developer.huawei.com/consumer/cn/doc/HMSCore-Guides/whale-hong-kinetic-energy-sdk-privacy-statement-0000001658283582">HUAWEI Ads 隐私声明</a><br><br>和<br><br><a href="https://developer.huawei.com/consumer/cn/doc/HMSCore-Guides/whale-hong-kinetic-sdk-compliance-user-guide-0000001658442922">HUAWEI Ads SDK隐私安全说明</a></td>
</tr>

<tr>
<td>章鱼广告</td>
<td>com.octopus.ad</td>
<td>增强广告 </td>
<td>设备品牌、设备型号、设备时区、设备语言、系统版本、开发者应用名、应用版本号、应用包名、网络类型、UserAgent信息、网络状态、崩溃信息、性能数据、屏幕高宽、屏幕方向、屏幕DPI信息、系统更新时间、开机时间、磁盘空间、物理内存、设备ID(OAID、GAID)、IMEI 用户授权才收集、USB调试模式、cpu、运行状态、运营商、传感器信息、掠过手势内容</td>
<td style="font-size:12px">
android.permission.INTERNET<br>
android.permission.ACCESS_NETWORK_STATE<br>
android.permission.ACCESS_WIFI_STATE<br>
android.permission.WRITE_EXTERNAL_STORAGE<br>
android.permission.READ_EXTERNAL_STORAGE<br>
</td>
<td>基于用户设备信息调整广告投放、统计分析、反作弊、实现广告正常显示与交互功能,通过崩溃信息,以此来优化代码缺陷,最大程度减少App崩溃。通过收集SDK运行过程中性能数据,以优化SDK的性能。统计广告数据,以用于广告主统计投放结果。</td>
<td><a href="https://doc.adintl.cn/#/zh-cn/guide/UsePrivacy">章鱼广告SDK隐私政策</a></td>
</tr>

<tr>
<td>倍孜广告</td>
<td>com.beizi.ad</td>
<td>增强广告 </td>
<td>设备品牌、设备型号、设备时区、设备语言、系统版本、网络类型、UserAgent信息、屏幕高宽、屏幕方向、屏幕DPI信息、系统更新时间、开机时间、磁盘空间、物理内存、运营商、sim卡状态、传感器信息、掠过手势内容、cpu、设备ID(国内用户OAID、海外用户GAID)、开发者应用名、应用版本号、应用包名、运行状态、使用数据、诊断数据</td>
<td style="font-size:12px">
android.permission.INTERNET<br>
android.permission.ACCESS_NETWORK_STATE<br>
android.permission.ACCESS_WIFI_STATE<br>
android.permission.WRITE_EXTERNAL_STORAGE<br>
android.permission.READ_EXTERNAL_STORAGE<br>
</td>
<td>广告投放策略、统计分析服务、反作弊分析、广告正常显示与交互功能的实现、广告归因、最大程度减少App崩溃、确保服务器正常运行、提升可扩展性和性能</td>
<td><a href="https://sdkdoc.beizi.biz/#/zh-cn/guide/UsePrivacy">BeiZi SDK隐私保护声明</a></td>
</tr>

<tr>
<td>泛连</td>
<td>com.fl.saas.s2s</td>
<td>增强广告 </td>
<td>设备品牌、型号、软件系统版本、屏幕密度、屏幕分辨率、设备语言、设备时区、IMEI、IMSI、ICCID、GAID、MEID、IDFA、IDFV、AndroidID、OAID、手机系统重启时间、设备的MAC地址、User Agent、IP地址、运营商信息、Wi-Fi状态、网络信号强度、应用版本、应用包名、应用名称、应用前后台状态、应用列表信息、加速度传感器、陀螺仪传感器、广告的展示、点击及转化等交互数据、系统崩溃数据、性能数据</td>
<td style="font-size:12px">
android.permission.INTERNET<br>
android.permission.ACCESS_NETWORK_STATE<br>
android.permission.ACCESS_WIFI_STATE<br>
android.permission.VIBRATE<br>
android.permission.REQUEST_INSTALL_PACKAGES<br>
android.permission.READ_PHONE_STATE<br/>
</td>
<td>广告投放及广告监测归因、反作弊、摇一摇广告投放、广告投放统计分析、提升SDK的稳定性,减少APP的崩溃</td>
<td><a href="https://www.adfunlink.com/doc/privacy.html">Funlink隐私保护声明</a></td>
</tr>

<tr>
<td>聚力阅盟</td>
<td>com.dcloudym</td>
<td>增强广告 </td>
<td>设备型号、操作系统版本、唯一设备标识符、设备环境等软硬件特征信息;GPS位置以及WLAN接入点、蓝牙和基站等传感器信息</td>
<td style="font-size:12px">
android.permission.INTERNET<br>
android.permission.ACCESS_NETWORK_STATE<br>
android.permission.ACCESS_WIFI_STATE<br>
android.permission.VIBRATE<br>
android.permission.REQUEST_INSTALL_PACKAGES<br>
android.permission.READ_PHONE_STATE<br/>
android.permission.WRITE_EXTERNAL_STORAGE<br/>
android.permission.ACCESS_COARSE_LOCATION<br/>
android.permission.ACCESS_FINE_LOCATION<br/>
</td>
<td>广告投放及广告监测归因、反作弊、摇一摇广告投放</td>
<td><a href="https://idbj.juliyuemeng.com/privacy">聚力阅盟隐私保护声明</a></td>
</tr>

<tr>
<td>华夏乐游(优推广告)</td>
<td>com.alliance.ssp.ad</td>
<td>增强广告 </td>
<td>设备信息: 必选信息:设备品牌、型号、软件系统版本、屏幕密度、屏幕分辨率、设备语言、设备时区等基础信息 【仅iOS】磁盘总空间、系统总内存空间; 可选信息:设备MAC地址、设备标识符(如IMEI、MEID,具体字段因软硬件版本不同而存在差异)如AndroidID、OAID、IMSI、IMEI、MEID 等。网络信息: 必选信息:运营商信息、网络状态(包括BSSID、SSID 等)、IP地址。应用信息 :必选信息:应用包名、版本号;可选信息:应用安装列表信息。传感器信息:必选信息:加速度传感器。广告信息: 必选信息:对广告的填充、展示、点击及转化等交互数据。位置信息: 可选信息:精确位置信息。性能数据: 必选信息:如崩溃数据、性能数据</td>
<td style="font-size:12px">
android.permission.ACCESS_NETWORK_STATE<br/>
android.permission.INTERNET<br/>
android.permission.READ_PHONE_STATE<br/>
android.permission.ACCESS_WIFI_STATE<br/>
android.permission.REQUEST_INSTALL_PACKAGES<br/>
android.permission.ACCESS_FINE_LOCATION<br/>
android.permission.ACCESS_COARSE_LOCATION<br/>
android.permission.READ_EXTERNAL_STORAGE<br/>
android.permission.WRITE_EXTERNAL_STORAGE<br/>
android.permission.QUERY_ALL_PACKAGES<br/>
</td>
<td>广告投放及广告反作弊。广告监测归因。保证网络服务有效性及稳定性。摇一摇、扭一扭功能。减少App崩溃、提供稳定可靠的服务</td>
<td><a href="https://lemon.gameley.com/flowdocs/%E4%BC%98%E6%8E%A8%E5%B9%BF%E5%91%8A%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8D%97/%E9%9A%90%E7%A7%81%E5%8D%8F%E8%AE%AE/%E4%BC%98%E6%8E%A8%E5%B9%BF%E5%91%8A%E5%B9%B3%E5%8F%B0SDK%E9%9A%90%E7%A7%81%E6%94%BF%E7%AD%96.html">优推广告平台 SDK 隐私政策</a></td>
</tr>
</table>

腾讯x5内核

<a id="e885bee8aeafx5e58685e6a0b8"/>

<table style="word-break:break-all">
<tr>
<th style="width:10%">SDK名称</th>
<th style="width:10%">包名信息</th>
<th style="width:15%">使用目的</th>
<th style="width:30%">使用的权限</th>
<th style="width:20%">涉及个人信息</th>
<th style="width:10%">隐私权政策链接</th>
</tr>
<tr>
<td>腾讯浏览服务SDK</td>
<td>com.tencent.tbs、com.tencent.smtt</td>
<td>x5内核渲染webview(请根据具体使用目的填写)</td>
<td style="font-size:12px">
android.permission.WRITE_EXTERNAL_STORAGE<br>
android.permission.ACCESS_NETWORK_STATE<br>
android.permission.ACCESS_WIFI_STATE<br>
android.permission.READ_PHONE_STATE
</td>
<td>存储的个人文件、读取手机状态和身份、网络信息</td>
<td><a href="https://x5.tencent.com/docs/privacy.html" target="_blank">https://x5.tencent.com/docs/privacy.html</a></td>
</tr>
</table>

Contacts

<a id="Contacts"/>

管理系统通讯录,用于可对系统通讯录进行增、删、改、查等操作。通过plus.contacts获取系统通讯录管理对象。

<table style="word-break:break-all">
<tr>
<th style="width:10%">SDK名称</th>
<th style="width:10%">包名信息</th>
<th style="width:25%">使用目的</th>
<th style="width:20%">使用的权限</th>
<th style="width:20%">涉及个人信息</th>
<th style="width:10%">隐私权政策链接</th>
</tr>
<tr>
<td>Contacts</td>
<td>io.dcloud.feature.contacts</td>
<td>管理系统通讯录,用于可对系统通讯录进行增、删、改、查等操作(请根据具体使用目的填写)</td>
<td style="font-size:12px">
android.permission.GET_ACCOUNTS<br>
android.permission.WRITE_CONTACTS<br>
android.permission.READ_CONTACTS
</td>
<td>获取联系人信息</td>
<td style="font-size:12px">(宿主根据APP自身逻辑 自行填写相关隐私政策信息)</td>
</tr>
</table>

Messaging

<a id="Messaging"/>

<table style="word-break:break-all">
<tr>
<th style="width:10%">SDK名称</th>
<th style="width:10%">包名信息</th>
<th style="width:25%">使用目的</th>
<th style="width:20%">使用的权限</th>
<th style="width:20%">涉及个人信息</th>
<th style="width:10%">隐私权政策链接</th>
</tr>
<tr>
<td>Messaging</td>
<td>io.dcloud.feature.messagings</td>
<td>管理设备通讯功能,可用于短信、彩信、邮件发送等(请根据具体使用目的填写)</td>
<td style="font-size:12px">
android.permission.RECEIVE_SMS<br>
android.permission.SEND_SMS<br>
android.permission.WRITE_SMS<br>
android.permission.READ_SMS
</td>
<td>读写短信、彩信、邮件</td>
<td style="font-size:12px">(宿主根据APP自身逻辑 自行填写相关隐私政策信息)</td>
</tr>
</table>

Bluetooth(低功耗蓝牙)

<a id="Bluetooth"/>

<table style="word-break:break-all">
<tr>
<th style="width:10%">SDK名称</th>
<th style="width:10%">包名信息</th>
<th style="width:25%">使用目的</th>
<th style="width:20%">使用的权限</th>
<th style="width:20%">涉及个人信息</th>
<th style="width:10%">隐私权政策链接</th>
</tr>
<tr>
<td>Bluetooth</td>
<td>io.dcloud.feature.bluetooth</td>
<td>访问蓝牙设备,包括搜索、连接。(请根据具体使用目的填写)</td>
<td style="font-size:12px">
android.permission.ACCESS_FINE_LOCATION<br>
android.permission.ACCESS_COARSE_LOCATION<br>
android.permission.BLUETOOTH<br>
android.permission.BLUETOOTH_ADMIN<br><br>
以下两种权限在targetSdkVersion31及以上才需要!<br>
android.permission.BLUETOOTH_SCAN<br>
android.permission.BLUETOOTH_CONNECT
</td>
<td>访问蓝牙设备、位置信息。</td>
<td style="font-size:12px">(宿主根据APP自身逻辑 自行填写相关隐私政策信息)</td>
</tr>
</table>

FacialRecognitionVerify(实人认证)

<a id="FacialRecognitionVerify"/>

<table style="word-break:break-all">
<tr>
<th style="width:10%">SDK名称</th>
<th style="width:10%">包名信息</th>
<th style="width:25%">使用目的</th>
<th style="width:20%">使用的权限</th>
<th style="width:20%">涉及个人信息</th>
<th style="width:10%">隐私权政策链接</th>
</tr>
<tr>
<td>实人认证</td>
<td>com.dtf.face.verify</td>
<td>实人认证服务搭载真人检测和人脸比对等生物识别技术,配合权威数据源验证,可快速校验自然人的真实身份。</td>
<td style="font-size:12px">
android.permission.READ_PHONE_STATE<br>
android.permission.INTERNET<br>
android.permission.WRITE_EXTERNAL_STORAGE<br>
android.permission.CAMERA<br>
</td>
<td>设备信息、最终用户上传的语音、图片信息、终端权限信息、日志信息</td>
<td style="font-size:12px"><a href="https://terms.aliyun.com/legal-agreement/terms/suit_bu1_ali_cloud/suit_bu1_ali_cloud202107281509_18386.html" target="_blank">https://terms.aliyun.com/legal-agreement/terms/suit_bu1_ali_cloud/suit_bu1_ali_cloud202107281509_18386.html</a></td>
</tr>
</table>

如果您的应用使用了依赖三方SDK的模块也需要将其合规条款添加到《隐私政策》中

uni原生插件

如果应用使用了uni原生插件,需要注意一下几点:

  • 使用插件时请查看插件详情页面中的 隐私、权限声明 。(插件使用什么sdk?获取了什么用户信息?都应由插件作者提供并填写在 隐私、权限声明中)
  • 将插件中用到的三方SDK信息添加到用户隐私协议中。例如集成了百度定位。就需要在隐私协议中说明集成了百度定位SDK。获取了xxx用户信息!用于xxx.
  • 如果发现插件有获取用户信息而插件详情页并没有提供隐私、权限声明,请与插件开发者或与我们反馈共同督促进行补充。

其它

《隐私政策》必须非常清楚、全面地说明(不要用可能收集、了解用户信息这种模糊不清晰的词语)收集用户个人信息的目的、方式和范围。
如果应用使用“通讯录”、“短信”等相关功能,请根据应用业务场景进行描述。

继续阅读 »

请根据App集成的功能模块补充相应模块的隐私协议

uni-app(5+、web2app)

<table style="word-break:break-all">
<tr>
<th style="width:10%">SDK名称</th>
<th style="width:10%">包名信息</th>
<th style="width:15%">使用目的</th>
<th style="width:30%">使用的权限</th>
<th style="width:15%">涉及个人信息</th>
<th style="width:10%">隐私权政策链接/官网</th>
</tr>
<tr>
<td>uni-app(5+、web2app)</td>
<td>io.dcloud</td>
<td>基础模块</td>
<td style="font-size:12px">
android.permission.INTERNET<br>
android.permission.ACCESS_NETWORK_STATE<br>
android.permission.WRITE_EXTERNAL_STORAGE<br>
android.permission.READ_EXTERNAL_STORAG<br>
android.permission.READ_PHONE_STATE
</td>
<td>存储的个人文件,设备信息(IMEI、ANDROID_ID、DEVICE_ID、IMSI),网络信息</td>
<td><a href="https://dcloud.io/license/appprivacy.html" target="_blank">https://dcloud.io/license/appprivacy.html</a></td>
</tr>
</table>

注意

  • 基础模块使用的权限说明及权限删减配置请参考文章Android平台云端打包权限配置
  • 离线打包请自行在AndroidManifest.xml中删减权限。
  • 关于READ_PHONE_STATE权限申请可根据权限策略文档配置屏蔽权限申请行为,具体请认真阅读文档!

uni-app默认集成功能模块

<table style="word-break:break-all">
<tr>
<th style="width:10%">SDK名称</th>
<th style="width:10%">包名信息</th>
<th style="width:15%">使用目的</th>
<th style="width:30%">使用的权限</th>
<th style="width:15%">涉及个人信息</th>
<th style="width:10%">隐私权政策链接/官网</th>
</tr>
<tr>
<td>阿里weexSDK</td>
<td>com.taobao</td>
<td>uni-app基础模块默认集成,用于渲染uniapp的nvue页面引擎</td>
<td style="font-size:12px">
android.permission.WRITE_EXTERNAL_STORAGE<br>
android.permission.READ_EXTERNAL_STORAG
</td>
<td>存储的个人文件</td>
<td><a href="https://weexapp.com/zh/" target="_blank">https://weexapp.com/zh/</a></td>
</tr>
<tr>
<td>Fresco图库</td>
<td>com.facebook.fresco</td>
<td>用于nvue页面加载图片使用</td>
<td style="font-size:12px">
android.permission.WRITE_EXTERNAL_STORAGE<br>
android.permission.READ_EXTERNAL_STORAG
</td>
<td>存储的个人文件</td>
<td><a href="https://www.fresco-cn.org/" target="_blank">https://www.fresco-cn.org/</a></td>
</tr>
<tr>
<td>glide图库</td>
<td>com.bumptech.glide</td>
<td>用于图片预览使用</td>
<td style="font-size:12px">
android.permission.WRITE_EXTERNAL_STORAGE<br>
android.permission.READ_EXTERNAL_STORAG
</td>
<td>存储的个人文件</td>
<td><a href="http://bumptech.github.io/glide/" target="_blank">http://bumptech.github.io/glide/</a></td>
</tr>
<tr>
<td>gif-drawable</td>
<td>pl.droidsonroids.gif</td>
<td>加载gif图</td>
<td style="font-size:12px">
android.permission.WRITE_EXTERNAL_STORAGE<br>
android.permission.READ_EXTERNAL_STORAG
</td>
<td>存储文件</td>
<td><a href="https://github.com/alibaba/fastjson" target="_blank">https://github.com/koral--/android-gif-drawable</a></td>
</tr>
<tr>
<td>fastjson</td>
<td>com.alibaba.fastjson</td>
<td>JSON解析</td>
<td style="font-size:12px">

</td>
<td>无</td>
<td><a href="https://github.com/alibaba/fastjson" target="_blank">https://github.com/alibaba/fastjson</a></td>
</tr>
<tr>
<td>移动安全联盟 OAID</td>
<td>com.bun.miitmdid、com.zui.opendeviceidlibrary、com.netease.nis、com.samsung.android、com.huawei.hms</td>
<td>获取oaid</td>
<td style="font-size:12px">

</td>
<td>设备信息</td>
<td><a href="http://www.msa-alliance.cn/col.jsp?id=122" target="_blank">http://www.msa-alliance.cn/col.jsp?id=122</a></td>
</tr>
</table>

关于移动安全联盟 OAID

移动智能终端补充设备标识体系与 SDK 隐私合规问题

移动智能终端补充设备标识体系与 SDK 严格遵守我国《网络安全法》、《数据安全法》和《电信和互联网用户个人信息保护规定》等相关法律法规和《信息安全技术 个人信息安全规范》等国家标准要求。SDK 不会主动收集任何数据,只在 APP 调用时获取以下数据,用于本地判断,不会进行任何网络传输:
­

  • 设备制造商、设备型号、设备品牌,用于判断终端调用接口
  • 设备网络运营商名称,用于判断虚拟机环境
  • APP 包名,用于校验签名

UniPush

<a id="push"></a>

UniPush是DCloud联合个推公司推出的集成型统一推送服务,使用了个推提供的SDK,因此需要在《隐私政策》中添加“个推消息推送SDK”相关说明。
建议《隐私政策》添加 “与授权合作伙伴共享”条款中,将 个推的用户隐私政策 加入其中,并向终端用户逐一明示您嵌入的SDK收集使用个人信息的目的、方式和范围。参考内容如下:

UniPush模块集成的三方SDK说明

<table style="word-break:break-all">
<tr>
<th style="width:10%">SDK名称</th>
<th style="width:10%">包名信息</th>
<th style="width:15%">使用目的</th>
<th style="width:30%">使用的权限</th>
<th style="width:20%">涉及个人信息</th>
<th style="width:10%">隐私权政策链接</th>
</tr>
<tr>
<td>个推·消息推送</td>
<td>com.igexin</td>
<td>消息推送(请根据具体使用目的填写)</td>
<td style="font-size:12px">
android.permission.ACCESS_NETWORK_STATE<br>
android.permission.ACCESS_WIFI_STATE<br>
android.permission.READ_PHONE_STATE<br>
android.permission.WRITE_EXTERNAL_STORAGE<br>
android.permission.VIBRATE<br>
android.permission.GET_TASKS<br>
android.permission.QUERY_ALL_PACKAGES
</td>
<td>存储的个人文件、设备信息、网络信息(必选信息:设备平台、设备厂商、设备品牌、设备型号及系统版本、OAID、AndroidID、WIFI连接信息(SSID、BSSID)、运营商信息、DHCP;可选信息:IMEI、MAC、Google Advertising ID(GAID)、Serial Number、IMSI、ICCID、IP地址、基站信息)、位置相关信息、已安装应用列表</td>
<td><a href="http://docs.getui.com/privacy" target="_blank">http://docs.getui.com/privacy</a></td>
</tr>
</table>

注意:unipush 配置了华为厂商推送,需要添加HMS相关隐私协议 需要注意

HMS push

推送服务(Push Kit)是华为提供的消息推送平台,建立了从云端到终端的消息推送通道。您通过集成推送服务,可以向客户端应用实时推送消息,因此需要在《隐私政策》中添加"HMS push"相关说明。

<table style="word-break:break-all">
<tr>
<th style="width:10%">SDK名称</th>
<th style="width:10%">包名信息</th>
<th style="width:15%">使用目的</th>
<th style="width:30%">使用的权限</th>
<th style="width:20%">涉及个人信息</th>
<th style="width:10%">隐私权政策链接</th>
</tr>
<tr>
<td>华为 HMS push</td>
<td>com.huawei.hms</td>
<td>华为手机厂商推送(请根据具体使用目的填写)</td>
<td style="font-size:12px">
android.permission.ACCESS_NETWORK_STATE<br>
android.permission.ACCESS_WIFI_STATE<br>
android.permission.REQUEST_INSTALL_PACKAGES<br>
android.permission.FOREGROUND_SERVICE<br>
android.permission.READ_PHONE_STATE
</td>
<td>设备信息(IMEI、ANDROID_ID、DEVICE_ID、IMSI)、应用已安装列表、网络信息</td>
<td><a href="https://developer.huawei.com/consumer/cn/doc/HMSCore-Guides/sdk-data-security-0000001050042177" target="_blank">推送隐私声明</a></td>
</tr>
</table>

魅族 Flyme push

魅族推送服务是由魅族公司为开发者提供的消息推送服务,开发者可以向集成了魅族pushSDK的客户端实时地推送通知或者消息,与用户保持互动,提高活跃率,因此需要在《隐私政策》中添加"Flyme push"相关说明。

<table style="word-break:break-all">
<tr>
<th style="width:10%">SDK名称</th>
<th style="width:10%">包名信息</th>
<th style="width:15%">使用目的</th>
<th style="width:30%">使用的权限</th>
<th style="width:20%">涉及个人信息</th>
<th style="width:10%">隐私权政策链接</th>
</tr>
<tr>
<td>魅族 Flyme push</td>
<td>com.meizu.cloud</td>
<td>魅族手机厂商推送(请根据具体使用目的填写)</td>
<td style="font-size:12px">
android.permission.INTERNET<br>
android.permission.ACCESS_NETWORK_STATE<br>
android.permission.READ_EXTERNAL_STORAGE<br>
android.permission.WRITE_EXTERNAL_STORAGE
</td>
<td>网络信息、存储的个人文件</td>
<td><a href="http://static.meizu.com/resources/term/privacy8.html" target="_blank">推送隐私声明</a></td>
</tr>
</table>

OPPO push

推送服务(OPPO PUSH)是OPPO公司向开发者提供的消息推送服务,通过服务端与OS端建立的一条稳定、可靠的长连接通道,向OPPO手机系统(ColorOS)上的APP应用客户端实时推送消息的服务。无论应用进程是否存在,均可正常收到消息。因此需要在《隐私政策》中添加"OPPO push"相关说明。

<table style="word-break:break-all">
<tr>
<th style="width:10%">SDK名称</th>
<th style="width:10%">包名信息</th>
<th style="width:15%">使用目的</th>
<th style="width:30%">使用的权限</th>
<th style="width:20%">涉及个人信息</th>
<th style="width:10%">隐私权政策链接</th>
</tr>
<tr>
<td>OPPO push</td>
<td>com.heytap</td>
<td>OPPO手机厂商推送(请根据具体使用目的填写)</td>
<td style="font-size:12px">
android.permission.INTERNET<br>
android.permission.ACCESS_NETWORK_STATE<br>
android.permission.ACCESS_WIFI_STATE
</td>
<td>网络信息</td>
<td><a href="https://open.oppomobile.com/new/developmentDoc/info?id=10288" target="_blank">推送隐私声明</a></td>
</tr>
</table>

vivo push

vivo推送(即Vpush)是vivo公司向开发者提供的消息推送服务,通过在云端与客户端之间建立一条稳定、可靠的长连接,为开发者提供向客户端应用实时推送消息的服务,支持百亿级的通知/消息推送,秒级触达移动用户,因此需要在《隐私政策》中添加"vivo push"相关说明。

<table style="word-break:break-all">
<tr>
<th style="width:10%">SDK名称</th>
<th style="width:10%">包名信息</th>
<th style="width:15%">使用目的</th>
<th style="width:30%">使用的权限</th>
<th style="width:20%">涉及个人信息</th>
<th style="width:10%">隐私权政策链接</th>
</tr>
<tr>
<td>vivo push</td>
<td>com.vivo.push</td>
<td>vivo手机厂商推送(请根据具体使用目的填写)</td>
<td style="font-size:12px">
android.permission.INTERNET
</td>
<td>网络信息</td>
<td><a href="https://dev.vivo.com.cn/documentCenter/doc/652#w1-12075822" target="_blank">推送隐私声明</a></td>
</tr>
</table>

小米 MiPush

小米推送(MiPush)是小米公司向开发者提供的消息推送服务,通过在云端与客户端之间建立一条稳定、可靠的长连接,为开发者提供向客户端应用实时推送消息的服务,有效地帮助开发者触达用户,提升App活跃度,因此需要在《隐私政策》中添加"小米 push"相关说明。

<table style="word-break:break-all">
<tr>
<th style="width:10%">SDK名称</th>
<th style="width:10%">包名信息</th>
<th style="width:15%">使用目的</th>
<th style="width:30%">使用的权限</th>
<th style="width:20%">涉及个人信息</th>
<th style="width:10%">隐私权政策链接</th>
</tr>
<tr>
<td>MiPush</td>
<td>com.xiaomi.push</td>
<td>小米手机厂商推送(请根据具体使用目的填写)</td>
<td style="font-size:12px">
android.permission.INTERNET<br>
android.permission.ACCESS_NETWORK_STATE<br>
android.permission.VIBRATE
</td>
<td>网络信息</td>
<td><a href="https://dev.mi.com/distribute/doc/details?pId=1534" target="_blank">推送隐私声明</a></td>
</tr>
</table>

Statistic

<a id="statistic"></a>

HX3.1.14+ 友盟SDK已升级到9.3.8版本 适配合规问题

  • 当你集成了统计模块。您需要确保App有《隐私政策》,并且在用户首次启动App时就弹出《隐私政策》取得用户同意!!!
  • 您务必告知用户您选择友盟+SDK服务,请在《隐私政策》中增加如下参考条款:“我们的产品集成友盟+SDK,友盟+SDK需要收集您的设备Mac地址、唯一设备识别码(IMEI/android ID/IDFA/OPENUDID/GUID、SIM 卡 IMSI 信息)以提供统计分析服务,并通过地理位置校准报表数据准确性,提供基础反作弊能力。”
  • 您务必确保用户同意《隐私政策》之后。再调用相关api!!!!

Statistic模块集成的三方SDK说明

<table style="word-break:break-all">
<tr>
<th style="width:10%">SDK名称</th>
<th style="width:10%">包名信息</th>
<th style="width:15%">使用目的</th>
<th style="width:30%">使用的权限</th>
<th style="width:20%">涉及个人信息</th>
<th style="width:10%">隐私权政策链接</th>
</tr>
<tr>
<td>友盟统计</td>
<td>com.uc.crashsdk、com.efs、com.umeng</td>
<td>统计(请根据具体使用目的填写)</td>
<td style="font-size:12px">
android.permission.ACCESS_NETWORK_STATE<br>
android.permission.ACCESS_WIFI_STATE<br>
android.permission.READ_PHONE_STATE
</td>
<td>设备信息(IMEI、ANDROID_ID、DEVICE_ID、IMSI)、应用已安装列表、网络信息</td>
<td><a href="https://www.umeng.com/page/policy" target="_blank">https://www.umeng.com/page/policy</a></td>
</tr>
</table>

OAuth、Share、Payment

<a id="oauth"/>
<a id="payment"/>
<a id="share"/>
登录、分享、支付存在引入相同SDK,这里统一进行说明:

<table style="word-break:break-all">
<tr>
<th style="width:10%">SDK名称</th>
<th style="width:10%">包名信息</th>
<th style="width:15%">使用目的</th>
<th style="width:30%">使用的权限</th>
<th style="width:20%">涉及个人信息</th>
<th style="width:10%">隐私权政策链接</th>
</tr>
<tr>
<td>微信开放平台</td>
<td>com.tencent.mm</td>
<td>登录、分享、支付(请根据具体使用目的填写)</td>
<td style="font-size:12px">
android.permission.ACCESS_NETWORK_STATE<br>
android.permission.ACCESS_WIFI_STATE
</td>
<td>存储的个人文件、网络信息</td>
<td><a href="https://weixin.qq.com/cgi-bin/readtemplate?lang=zh_CN&t=weixin_agreement&s=privacy" target="_blank">微信隐私协议</a></td>
</tr>
<tr>
<td>新浪开放平台</td>
<td>com.sina.weibo</td>
<td>登录、分享(请根据具体使用目的填写)</td>
<td style="font-size:12px">
android.permission.ACCESS_NETWORK_STATE<br>
android.permission.ACCESS_WIFI_STATE
</td>
<td>存储的个人文件、网络信息</td>
<td><a href="https://weibo.com/signup/v5/privacy?spm=a1zaa.8161610.0.0.4f8776217Wu8R1" target="_blank">新浪隐私协议</a></td>
</tr>
<tr>
<td>QQ开放平台</td>
<td>com.tencent.open</td>
<td>登录、分享(请根据具体使用目的填写)</td>
<td style="font-size:12px">
android.permission.MODIFY_AUDIO_SETTINGS<br>
android.permission.ACCESS_NETWORK_STATE<br>
android.permission.ACCESS_WIFI_STATE
</td>
<td>存储的个人文件、读取手机状态和身份、网络信息</td>
<td><a href="https://wiki.connect.qq.com/qq%e4%ba%92%e8%81%94sdk%e9%9a%90%e7%a7%81%e4%bf%9d%e6%8a%a4%e5%a3%b0%e6%98%8e" target="_blank">qq隐私协议</a></td>
</tr>
<tr>
<td>支付宝开放平台</td>
<td>com.alipay</td>
<td>支付(请根据具体使用目的填写)</td>
<td style="font-size:12px">
android.permission.ACCESS_NETWORK_STATE<br>
android.permission.ACCESS_WIFI_STATE
</td>
<td>网络信息 设备id IP地址 OAID IMSI</td>
<td><a href="https://render.alipay.com/p/c/k2cx0tg8" target="_blank">支付宝隐私协议</a></td>
</tr>
</table>

一键登录

<table style="word-break:break-all">
<tr>
<th style="width:10%">SDK名称</th>
<th style="width:10%">包名信息</th>
<th style="width:15%">使用目的</th>
<th style="width:30%">使用的权限</th>
<th style="width:20%">涉及个人信息</th>
<th style="width:10%">隐私权政策链接</th>
</tr>
<tr>
<td>个验一键登录</td>
<td>com.g.elogin、com.g.gysdk、cn.com.chinatelecom</td>
<td>登录(请根据具体使用目的填写)</td>
<td style="font-size:12px">
android.permission.READ_PHONE_STATE<br>
android.permission.READ_EXTERNAL_STORAGE<br>
android.permission.WRITE_EXTERNAL_STORAGE<br>
android.permission.ACCESS_NETWORK_STATE<br>
android.permission.ACCESS_WIFI_STATE<br>
android.permission.CHANGE_NETWORK_STATE
</td>
<td>设备信息、网络信息(必选信息:设备平台、设备厂商、设备品牌、设备型号及系统版本、OAID、AndroidID、WIFI连接信息(SSID、BSSID)、运营商信息、DHCP、IP地址、去标识化的手机号码;可选信息:IMEI、MAC、Google Advertising ID(GAID)、Serial Number、IMSI、ICCID、基站信息)、存储的个人文件、读取手机状态和身份、位置相关信息、已安装应用列表</td>
<td> <a href="https://docs.getui.com/privacy/" target="_blank">个验</a> <br><a href="https://wap.cmpassport.com/resources/html/contract.html" target="_blank">中国移动认证服务条款</a><br>
<a href="https://opencloud.wostore.cn/authz/resource/html/disclaimer.html?fromsdk=true" target="_blank">联通统一认证服务条款</a>
</td>
</tr>
</table>

一键登录包含以下登录认证需要在隐私协议中补充

Speech

<a id="speech"/>
Speech模块集成的三方SDK说明

百度语音

<table style="word-break:break-all">
<tr>
<th style="width:10%">SDK名称</th>
<th style="width:10%">包名信息</th>
<th style="width:15%">使用目的</th>
<th style="width:30%">使用的权限</th>
<th style="width:20%">涉及个人信息</th>
<th style="width:10%">隐私权政策链接</th>
</tr>
<tr>
<td>百度语音识别</td>
<td>com.baidu.speech</td>
<td>语音识别(请根据具体使用目的填写)</td>
<td style="font-size:12px">
android.permission.RECORD_AUDIO<br>
android.permission.ACCESS_NETWORK_STATE<br>
android.permission.ACCESS_WIFI_STATE<br>
android.permission.CHANGE_NETWORK_STATE<br>
android.permission.READ_PHONE_STATE<br>
android.permission.WRITE_EXTERNAL_STORAGE
</td>
<td>存储的个人文件、读取手机状态和身份、网络信息</td>
<td><a href="https://ai.baidu.com/ai-doc/REFERENCE/Qkdykq1r3" target="_blank">https://ai.baidu.com/ai-doc/REFERENCE/Qkdykq1r3</a></td>
</tr>
</table>

Map & Geolocation

<a id="map-amp-geolocation"/>
Map & Geolocation模块集成的三方SDK说明

<table style="word-break:break-all">
<tr>
<th style="width:10%">SDK名称</th>
<th style="width:10%">包名信息</th>
<th style="width:15%">使用目的</th>
<th style="width:30%">使用的权限</th>
<th style="width:20%">涉及个人信息</th>
<th style="width:10%">隐私权政策链接</th>
</tr>
<tr>
<td>高德开放平台</td>
<td>com.amap.api, com.loc, com.autonavi</td>
<td>实现定位/展现地图(请根据具体使用目的填写)</td>
<td style="font-size:12px">
android.permission.ACCESS_COARSE_LOCATION<br>
android.permission.ACCESS_FINE_LOCATION<br>
android.permission.ACCESS_NETWORK_STATE<br>
android.permission.ACCESS_WIFI_STATE<br>
android.permission.CHANGE_WIFI_STATE<br>
android.permission.READ_PHONE_STATE<br>
android.permission.WRITE_EXTERNAL_STORAGE<br>
android.permission.ACCESS_LOCATION_EXTRA_COMMANDS
</td>
<td>存储的个人文件、位置信息、读取手机状态和身份、网络信息、传感器信息、Android ID</td>
<td><a href="https://lbs.amap.com/pages/privacy/" target="_blank">https://lbs.amap.com/pages/privacy/</a></td>
</tr>
<tr>
<td>百度开放平台</td>
<td>com.baidu</td>
<td>实现定位/展现地图(请根据具体使用目的填写)</td>
<td style="font-size:12px">
android.permission.ACCESS_COARSE_LOCATION<br>
android.permission.ACCESS_FINE_LOCATION<br>
android.permission.ACCESS_NETWORK_STATE<br>
android.permission.ACCESS_WIFI_STATE<br>
android.permission.CHANGE_WIFI_STATE<br>
android.permission.READ_PHONE_STATE<br>
android.permission.WRITE_EXTERNAL_STORAGE<br>
android.permission.ACCESS_LOCATION_EXTRA_COMMANDS<br>
android.permission.READ_LOGS<br>
android.permission.WRITE_SETTINGS<br>
android.permission.MOUNT_UNMOUNT_FILESYSTEM
</td>
<td>存储的个人文件、位置信息、读取手机状态和身份、网络信息</td>
<td><a href="https://map.baidu.com/zt/client/privacy/index.html" target="_blank">https://map.baidu.com/zt/client/privacy/index.html</a></td>
</tr>
</table>

注意

  • 关于高德SDK在后台收集个人信息的问题,请在《隐私政策》中参考补充如下条款:我们的产品集成了高德SDK,应用在后台状态下高德SDK可能会收集设备标识信息(Android ID)以支持在后台继续提供相关服务。

uni-ad

<a id="uniAd"/>

uni-ad广告模块集成的三方SDK说明

<table style="word-break:break-all">
<tr>
<th style="width:8%">SDK名称</th>
<th style="width:10%">SDK包名/网址</th>
<th style="width:8%">SDK用途</th>
<th style="width:20%">可能获取的个人信息类型</th>
<th style="width:25%">调用的设备权限</th>
<th style="width:20%">信息用途</th>
<th style="width:10%">SDK隐私政策链接/目的</th>
</tr>
<tr>
<td>uni-ad</td>
<td></td>
<td>基础广告 </td>
<td style="font-size:12px">设备品牌、型号、操作系统版本、OAID、分辨率、IMEI、android ID、SIM 卡 IMSI 信息、应用名称、应用包名、应用版本号、网络信息、应用安装列表、位置信息 </td>
<td style="font-size:12px">
android.permission.ACCESS_NETWORK_STATE <br>
android.permission.READ_PHONE_STATE <br>
android.permission.ACCESS_COARSE_LOCATION
</td>
<td>广告投放合作,广告归因、反作弊、安全 </td>
<td><a href="https://doc.dcloud.net.cn/markdown-share-docs/1d821cdd3cdf2681045ec4be94bc8404/" target="_blank">隐私协议</a></td>
</tr>
<tr>
<td>推啊 </td>
<td> engine.tuifish.com </td>
<td>基础广告 </td>
<td style="font-size:12px">设备品牌、型号、操作系统版本、OAID、分辨率、IMEI、android ID、SIM 卡 IMSI 信息、应用名称、应用包名、应用版本号、网络信息、应用安装列表、位置信息 </td>
<td style="font-size:12px">
android.permission.ACCESS_NETWORK_STATE <br>
android.permission.READ_PHONE_STATE <br>
android.permission.ACCESS_COARSE_LOCATION
</td>
<td style="font-size:12px">识别广告、活动作弊行为;改善 SDK 崩溃率、推送个性化广告;广告投放。 </td>
<td><a href= "https://yun.tuia.cn/tuia/sdk/agreement/index.html" target="_blank">推啊隐私协议</a></td>
</tr>
<tr>
<td>快手 </td>
<td>com.kwad.sdk </td>
<td>增强广告 </td>
<td>基础信息:设备品牌、设备型号、软件系统版本、存储信息、运营商信息、设备时区、设备语言、网络信息等基础信息</br>
设备标识:IMEIs、MEID、OAID、AndroidID、IMSIs、ICCID</br>
位置信息:IP地址、MAC地址、GPS位置信息、基站信息、WIFI信息</br>
应用信息:应用安装列表</br>
其他信息:传感器信息、sim卡激活信息</td>
<td style="font-size:12px">
android.permission.ACCESS_NETWORK_STATE <br>
android.permission.INTERNET <br>
android.permission.READ_PHONE_STATE <br>
android.permission.ACCESS_WIFI_STATE <br>
android.permission.REQUEST_INSTALL_PACKAGES <br>
android.permission.VIBRATE
</td>
<td>广告投放、广告归因、反作弊、安全 </td>
<td><a href="https://www.kuaishou.com/about/policy" target="_blank">快手内容联盟隐私协议</a>和<a href="https://u.kuaishou.com/home/detail/1220" target="_blank">SDK使用规范</a></td>
</tr>
<tr>
<td>快手内容联盟 </td>
<td>com.kwad.sdk </td>
<td>增强广告 </td>
<td>基础信息:设备品牌、设备型号、软件系统版本、存储信息、运营商信息、设备时区、设备语言、网络信息等基础信息</br>
设备标识:IMEIs、MEID、OAID、AndroidID、IMSIs、ICCID</br>
位置信息:IP地址、MAC地址、GPS位置信息、基站信息、WIFI信息</br>
应用信息:应用安装列表</br>
其他信息:传感器信息、sim卡激活信息 </td>
<td style="font-size:12px">
android.permission.ACCESS_NETWORK_STATE <br>
android.permission.INTERNET <br>
android.permission.READ_PHONE_STATE <br>
android.permission.ACCESS_WIFI_STATE <br>
android.permission.REQUEST_INSTALL_PACKAGES <br>
android.permission.VIBRATE <br>
android.permission.SET_WALLPAPER<br>
android.permission.READ_EXTERNAL_STORAGE <br>
android.permission.WRITE_EXTERNAL_STORAGE <br>
android.permission.ACCESS_COARSE_LOCATION <br>
android.permission.BLUETOOTH
</td>
<td>广告投放、广告归因、反作弊、安全 </td>
<td><a href="https://www.kuaishou.com/about/policy" target="_blank">快手内容联盟隐私协议</a>和<a href="https://u.kuaishou.com/home/detail/1220" target="_blank">SDK使用规范</a></td>
</tr>
<tr>
<td>优量汇 </td>
<td>com.qq.e </td>
<td>增强广告 </td>
<td>基站、附近的WIFI、连接的WIFI、位置信息、设备制造商、设备型号、操作系统版本、屏幕分辨率、屏幕方向、屏幕DPI、IP地址、加速度传感器、磁场传感器、OAID、IMEI/MEID(Device ID)、Android_ID、包名、版本号、进程名称、运行状态、可疑行为、应用安装信息 </td>
<td style="font-size:12px">
android.permission.INTERNET <br>
android.permission.ACCESS_NETWORK_STATE <br>
android.permission.ACCESS_WIFI_STATE <br>
android.permission.REQUEST_INSTALL_PACKAGES <br>
android.permission.CHANGE_NETWORK_STATE<br>
android.permission.QUERY_ALL_PACKAGES <br>
android.permission.REORDER_TASKS<br>
android.permission.VIBRATE <br>
android.permission.ACCESS_COARSE_LOCATION
</td>
<td style="font-size:12px">广告投放与监测归因、广告主统计投放结果、减少App崩溃、确保服务器正常运行、提升可扩展性和性能</td>
<td><a href="https://e.qq.com/dev/help_detail.html?cid=2005&pid=5983" target="_blank">优量汇隐私协议</a></td>
</tr>
<tr>
<td>穿山甲 </td>
<td>com.bytedance.sdk.openadsdk</td>
<td>增强广告 </td>
<td>设备品牌、型号、软件系统版本、屏幕密度、屏幕分辨率、设备语言、设备时区、sim卡信息(mcc&mnc)、CPU信息、可用存储空间大小、MAC地址、设备标识符(如IMEI、IMSI、ICCID、GAID(仅GMS服务)、MEID、硬件序列号build_serial、AndroidID、OAID、运营商信息、Wi-Fi状态、网络信号强度、IP地址、应用包名、运行中的进程信息、版本号、应用前后台状态、软件列表信息、线性加速度传感器、磁场传感器、旋转矢量传感器、精确位置信息、粗略位置信息(WiFi列表、WLAN接入点(如SSID,BSSID)、基站) </td>
<td style="font-size:12px">
android.permission.ACCESS_NETWORK_STATE <br>
android.permission.READ_PHONE_STATE <br>
android.permission.WRITE_EXTERNAL_STORAGE
</td>
<td>广告投放合作、广告归因、反作弊 </td>
<td><a href="https://www.pangle.cn/privacy/partner" target="_blank">穿山甲隐私协议</a></td>
</tr>
<tr>
<td>Sigmob </td>
<td>com.sigmob.windad </td>
<td>增强广告 </td>
<td>设备信息:设备品牌、型号、操作系统版本、OAID、分辨率等基础设备信息
应用信息:应用名称、应用包名、应用版本号等
其他:运营商信息、时区</td>
<td style="font-size:12px">
android.permission.ACCESS_NETWORK_STATE<br>
android.permission.INTERNET <br>
android.permission.ACCESS_WIFI_STATE <br>
android.permission.CHANGE_WIFI_STATE <br>
android.permission.READ_PHONE_STATE <br>
android.permission.REQUEST_INSTALL_PACKAGES <br>
android.permission.QUERY_ALL_PACKAGES
</td>
<td>广告投放、广告主归因、反作弊 </td>
<td><a href="https://doc.sigmob.com/Sigmob%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8D%97/%E5%90%88%E8%A7%84%E6%9D%A1%E6%AC%BE/%E9%9A%90%E7%A7%81%E6%94%BF%E7%AD%96/">Sigmob隐私协议</a></td>
</tr>
<tr>
<td>百度百青藤</td>
<td>com.baidu.mobads.proxy </td>
<td>增强广告 </td>
<td>设备信息:设备品牌、型号、软件系统版本、分辨率、网络信号强度、传感器信息,磁盘总空间、系统总内存空间、手机重启信息、手机系统更新时间等基础信息、OAID、AndroidID、屏幕宽高,屏幕像素密度,系统版本号,设备厂商,设备型号,手机运营商,手机网络状态,设备剩余存储空间,手机重启时间和更新时间
开发者应用信息:应用包名、应用前后台状态
设备信息:IMEI、IMSI、MEID
位置信息</td>
<td style="font-size:12px">
android.permission.INTERNET<br>
android.permission.ACCESS_NETWORK_STATE<br>
android.permission.ACCESS_WIFI_STATE<br>
android.permission.READ_PHONE_STATE<br>
android.permission.ACCESS_COARSE_LOCATION<br>
android.permissio.WRITE_EXTERNAL_STORAGE<br>
</td>
<td>为最终用户提供安全保障、改善我们的产品和服务,开展内部审计、数据分析和研究 </td>
<td><a href="https://union.baidu.com/bqt/#/legal/policies">百度百青藤隐私协议</a></td>
</tr>

<tr>
<td>HUAWEI Ads</td>
<td>com.huawei.hms.ads.lite</td>
<td>增强广告 </td>
<td>设备信息、网络信息、位置信息、应用信息、应用使用信息、上下文信息</td>
<td style="font-size:12px">
android.permission.INTERNET<br>
android.permission.ACCESS_NETWORK_STATE<br>
android.permission.ACCESS_WIFI_STATE<br>
</td>
<td>单次请求的广告定向投放、程序化广告投放、广告监测归因与反作弊。</td>
<td><a href="https://developer.huawei.com/consumer/cn/doc/HMSCore-Guides/whale-hong-kinetic-energy-sdk-privacy-statement-0000001658283582">HUAWEI Ads 隐私声明</a><br><br>和<br><br><a href="https://developer.huawei.com/consumer/cn/doc/HMSCore-Guides/whale-hong-kinetic-sdk-compliance-user-guide-0000001658442922">HUAWEI Ads SDK隐私安全说明</a></td>
</tr>

<tr>
<td>章鱼广告</td>
<td>com.octopus.ad</td>
<td>增强广告 </td>
<td>设备品牌、设备型号、设备时区、设备语言、系统版本、开发者应用名、应用版本号、应用包名、网络类型、UserAgent信息、网络状态、崩溃信息、性能数据、屏幕高宽、屏幕方向、屏幕DPI信息、系统更新时间、开机时间、磁盘空间、物理内存、设备ID(OAID、GAID)、IMEI 用户授权才收集、USB调试模式、cpu、运行状态、运营商、传感器信息、掠过手势内容</td>
<td style="font-size:12px">
android.permission.INTERNET<br>
android.permission.ACCESS_NETWORK_STATE<br>
android.permission.ACCESS_WIFI_STATE<br>
android.permission.WRITE_EXTERNAL_STORAGE<br>
android.permission.READ_EXTERNAL_STORAGE<br>
</td>
<td>基于用户设备信息调整广告投放、统计分析、反作弊、实现广告正常显示与交互功能,通过崩溃信息,以此来优化代码缺陷,最大程度减少App崩溃。通过收集SDK运行过程中性能数据,以优化SDK的性能。统计广告数据,以用于广告主统计投放结果。</td>
<td><a href="https://doc.adintl.cn/#/zh-cn/guide/UsePrivacy">章鱼广告SDK隐私政策</a></td>
</tr>

<tr>
<td>倍孜广告</td>
<td>com.beizi.ad</td>
<td>增强广告 </td>
<td>设备品牌、设备型号、设备时区、设备语言、系统版本、网络类型、UserAgent信息、屏幕高宽、屏幕方向、屏幕DPI信息、系统更新时间、开机时间、磁盘空间、物理内存、运营商、sim卡状态、传感器信息、掠过手势内容、cpu、设备ID(国内用户OAID、海外用户GAID)、开发者应用名、应用版本号、应用包名、运行状态、使用数据、诊断数据</td>
<td style="font-size:12px">
android.permission.INTERNET<br>
android.permission.ACCESS_NETWORK_STATE<br>
android.permission.ACCESS_WIFI_STATE<br>
android.permission.WRITE_EXTERNAL_STORAGE<br>
android.permission.READ_EXTERNAL_STORAGE<br>
</td>
<td>广告投放策略、统计分析服务、反作弊分析、广告正常显示与交互功能的实现、广告归因、最大程度减少App崩溃、确保服务器正常运行、提升可扩展性和性能</td>
<td><a href="https://sdkdoc.beizi.biz/#/zh-cn/guide/UsePrivacy">BeiZi SDK隐私保护声明</a></td>
</tr>

<tr>
<td>泛连</td>
<td>com.fl.saas.s2s</td>
<td>增强广告 </td>
<td>设备品牌、型号、软件系统版本、屏幕密度、屏幕分辨率、设备语言、设备时区、IMEI、IMSI、ICCID、GAID、MEID、IDFA、IDFV、AndroidID、OAID、手机系统重启时间、设备的MAC地址、User Agent、IP地址、运营商信息、Wi-Fi状态、网络信号强度、应用版本、应用包名、应用名称、应用前后台状态、应用列表信息、加速度传感器、陀螺仪传感器、广告的展示、点击及转化等交互数据、系统崩溃数据、性能数据</td>
<td style="font-size:12px">
android.permission.INTERNET<br>
android.permission.ACCESS_NETWORK_STATE<br>
android.permission.ACCESS_WIFI_STATE<br>
android.permission.VIBRATE<br>
android.permission.REQUEST_INSTALL_PACKAGES<br>
android.permission.READ_PHONE_STATE<br/>
</td>
<td>广告投放及广告监测归因、反作弊、摇一摇广告投放、广告投放统计分析、提升SDK的稳定性,减少APP的崩溃</td>
<td><a href="https://www.adfunlink.com/doc/privacy.html">Funlink隐私保护声明</a></td>
</tr>

<tr>
<td>聚力阅盟</td>
<td>com.dcloudym</td>
<td>增强广告 </td>
<td>设备型号、操作系统版本、唯一设备标识符、设备环境等软硬件特征信息;GPS位置以及WLAN接入点、蓝牙和基站等传感器信息</td>
<td style="font-size:12px">
android.permission.INTERNET<br>
android.permission.ACCESS_NETWORK_STATE<br>
android.permission.ACCESS_WIFI_STATE<br>
android.permission.VIBRATE<br>
android.permission.REQUEST_INSTALL_PACKAGES<br>
android.permission.READ_PHONE_STATE<br/>
android.permission.WRITE_EXTERNAL_STORAGE<br/>
android.permission.ACCESS_COARSE_LOCATION<br/>
android.permission.ACCESS_FINE_LOCATION<br/>
</td>
<td>广告投放及广告监测归因、反作弊、摇一摇广告投放</td>
<td><a href="https://idbj.juliyuemeng.com/privacy">聚力阅盟隐私保护声明</a></td>
</tr>

<tr>
<td>华夏乐游(优推广告)</td>
<td>com.alliance.ssp.ad</td>
<td>增强广告 </td>
<td>设备信息: 必选信息:设备品牌、型号、软件系统版本、屏幕密度、屏幕分辨率、设备语言、设备时区等基础信息 【仅iOS】磁盘总空间、系统总内存空间; 可选信息:设备MAC地址、设备标识符(如IMEI、MEID,具体字段因软硬件版本不同而存在差异)如AndroidID、OAID、IMSI、IMEI、MEID 等。网络信息: 必选信息:运营商信息、网络状态(包括BSSID、SSID 等)、IP地址。应用信息 :必选信息:应用包名、版本号;可选信息:应用安装列表信息。传感器信息:必选信息:加速度传感器。广告信息: 必选信息:对广告的填充、展示、点击及转化等交互数据。位置信息: 可选信息:精确位置信息。性能数据: 必选信息:如崩溃数据、性能数据</td>
<td style="font-size:12px">
android.permission.ACCESS_NETWORK_STATE<br/>
android.permission.INTERNET<br/>
android.permission.READ_PHONE_STATE<br/>
android.permission.ACCESS_WIFI_STATE<br/>
android.permission.REQUEST_INSTALL_PACKAGES<br/>
android.permission.ACCESS_FINE_LOCATION<br/>
android.permission.ACCESS_COARSE_LOCATION<br/>
android.permission.READ_EXTERNAL_STORAGE<br/>
android.permission.WRITE_EXTERNAL_STORAGE<br/>
android.permission.QUERY_ALL_PACKAGES<br/>
</td>
<td>广告投放及广告反作弊。广告监测归因。保证网络服务有效性及稳定性。摇一摇、扭一扭功能。减少App崩溃、提供稳定可靠的服务</td>
<td><a href="https://lemon.gameley.com/flowdocs/%E4%BC%98%E6%8E%A8%E5%B9%BF%E5%91%8A%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8D%97/%E9%9A%90%E7%A7%81%E5%8D%8F%E8%AE%AE/%E4%BC%98%E6%8E%A8%E5%B9%BF%E5%91%8A%E5%B9%B3%E5%8F%B0SDK%E9%9A%90%E7%A7%81%E6%94%BF%E7%AD%96.html">优推广告平台 SDK 隐私政策</a></td>
</tr>
</table>

腾讯x5内核

<a id="e885bee8aeafx5e58685e6a0b8"/>

<table style="word-break:break-all">
<tr>
<th style="width:10%">SDK名称</th>
<th style="width:10%">包名信息</th>
<th style="width:15%">使用目的</th>
<th style="width:30%">使用的权限</th>
<th style="width:20%">涉及个人信息</th>
<th style="width:10%">隐私权政策链接</th>
</tr>
<tr>
<td>腾讯浏览服务SDK</td>
<td>com.tencent.tbs、com.tencent.smtt</td>
<td>x5内核渲染webview(请根据具体使用目的填写)</td>
<td style="font-size:12px">
android.permission.WRITE_EXTERNAL_STORAGE<br>
android.permission.ACCESS_NETWORK_STATE<br>
android.permission.ACCESS_WIFI_STATE<br>
android.permission.READ_PHONE_STATE
</td>
<td>存储的个人文件、读取手机状态和身份、网络信息</td>
<td><a href="https://x5.tencent.com/docs/privacy.html" target="_blank">https://x5.tencent.com/docs/privacy.html</a></td>
</tr>
</table>

Contacts

<a id="Contacts"/>

管理系统通讯录,用于可对系统通讯录进行增、删、改、查等操作。通过plus.contacts获取系统通讯录管理对象。

<table style="word-break:break-all">
<tr>
<th style="width:10%">SDK名称</th>
<th style="width:10%">包名信息</th>
<th style="width:25%">使用目的</th>
<th style="width:20%">使用的权限</th>
<th style="width:20%">涉及个人信息</th>
<th style="width:10%">隐私权政策链接</th>
</tr>
<tr>
<td>Contacts</td>
<td>io.dcloud.feature.contacts</td>
<td>管理系统通讯录,用于可对系统通讯录进行增、删、改、查等操作(请根据具体使用目的填写)</td>
<td style="font-size:12px">
android.permission.GET_ACCOUNTS<br>
android.permission.WRITE_CONTACTS<br>
android.permission.READ_CONTACTS
</td>
<td>获取联系人信息</td>
<td style="font-size:12px">(宿主根据APP自身逻辑 自行填写相关隐私政策信息)</td>
</tr>
</table>

Messaging

<a id="Messaging"/>

<table style="word-break:break-all">
<tr>
<th style="width:10%">SDK名称</th>
<th style="width:10%">包名信息</th>
<th style="width:25%">使用目的</th>
<th style="width:20%">使用的权限</th>
<th style="width:20%">涉及个人信息</th>
<th style="width:10%">隐私权政策链接</th>
</tr>
<tr>
<td>Messaging</td>
<td>io.dcloud.feature.messagings</td>
<td>管理设备通讯功能,可用于短信、彩信、邮件发送等(请根据具体使用目的填写)</td>
<td style="font-size:12px">
android.permission.RECEIVE_SMS<br>
android.permission.SEND_SMS<br>
android.permission.WRITE_SMS<br>
android.permission.READ_SMS
</td>
<td>读写短信、彩信、邮件</td>
<td style="font-size:12px">(宿主根据APP自身逻辑 自行填写相关隐私政策信息)</td>
</tr>
</table>

Bluetooth(低功耗蓝牙)

<a id="Bluetooth"/>

<table style="word-break:break-all">
<tr>
<th style="width:10%">SDK名称</th>
<th style="width:10%">包名信息</th>
<th style="width:25%">使用目的</th>
<th style="width:20%">使用的权限</th>
<th style="width:20%">涉及个人信息</th>
<th style="width:10%">隐私权政策链接</th>
</tr>
<tr>
<td>Bluetooth</td>
<td>io.dcloud.feature.bluetooth</td>
<td>访问蓝牙设备,包括搜索、连接。(请根据具体使用目的填写)</td>
<td style="font-size:12px">
android.permission.ACCESS_FINE_LOCATION<br>
android.permission.ACCESS_COARSE_LOCATION<br>
android.permission.BLUETOOTH<br>
android.permission.BLUETOOTH_ADMIN<br><br>
以下两种权限在targetSdkVersion31及以上才需要!<br>
android.permission.BLUETOOTH_SCAN<br>
android.permission.BLUETOOTH_CONNECT
</td>
<td>访问蓝牙设备、位置信息。</td>
<td style="font-size:12px">(宿主根据APP自身逻辑 自行填写相关隐私政策信息)</td>
</tr>
</table>

FacialRecognitionVerify(实人认证)

<a id="FacialRecognitionVerify"/>

<table style="word-break:break-all">
<tr>
<th style="width:10%">SDK名称</th>
<th style="width:10%">包名信息</th>
<th style="width:25%">使用目的</th>
<th style="width:20%">使用的权限</th>
<th style="width:20%">涉及个人信息</th>
<th style="width:10%">隐私权政策链接</th>
</tr>
<tr>
<td>实人认证</td>
<td>com.dtf.face.verify</td>
<td>实人认证服务搭载真人检测和人脸比对等生物识别技术,配合权威数据源验证,可快速校验自然人的真实身份。</td>
<td style="font-size:12px">
android.permission.READ_PHONE_STATE<br>
android.permission.INTERNET<br>
android.permission.WRITE_EXTERNAL_STORAGE<br>
android.permission.CAMERA<br>
</td>
<td>设备信息、最终用户上传的语音、图片信息、终端权限信息、日志信息</td>
<td style="font-size:12px"><a href="https://terms.aliyun.com/legal-agreement/terms/suit_bu1_ali_cloud/suit_bu1_ali_cloud202107281509_18386.html" target="_blank">https://terms.aliyun.com/legal-agreement/terms/suit_bu1_ali_cloud/suit_bu1_ali_cloud202107281509_18386.html</a></td>
</tr>
</table>

如果您的应用使用了依赖三方SDK的模块也需要将其合规条款添加到《隐私政策》中

uni原生插件

如果应用使用了uni原生插件,需要注意一下几点:

  • 使用插件时请查看插件详情页面中的 隐私、权限声明 。(插件使用什么sdk?获取了什么用户信息?都应由插件作者提供并填写在 隐私、权限声明中)
  • 将插件中用到的三方SDK信息添加到用户隐私协议中。例如集成了百度定位。就需要在隐私协议中说明集成了百度定位SDK。获取了xxx用户信息!用于xxx.
  • 如果发现插件有获取用户信息而插件详情页并没有提供隐私、权限声明,请与插件开发者或与我们反馈共同督促进行补充。

其它

《隐私政策》必须非常清楚、全面地说明(不要用可能收集、了解用户信息这种模糊不清晰的词语)收集用户个人信息的目的、方式和范围。
如果应用使用“通讯录”、“短信”等相关功能,请根据应用业务场景进行描述。

收起阅读 »