Skip to content

Commit

Permalink
5.4.5 支持运行时权限说明
Browse files Browse the repository at this point in the history
  • Loading branch information
os-jiejp01 committed Sep 2, 2024
1 parent f700fb1 commit 0ffbd60
Show file tree
Hide file tree
Showing 19 changed files with 612 additions and 89 deletions.
97 changes: 97 additions & 0 deletions udesksdk/SDK隐私政策文案.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,97 @@

开发者:北京沃丰时代数据科技有限公司
北京沃丰时代数据科技有限公司(以下简称“我们”)尊重并保护用户(以下简称“您”)隐私,在您使用我们服务时,我们将按照本隐私协议收集、存储、使用个人信息。
本隐私政策将帮助您了解以下内容:

一、我们如何收集信息
在您使用的过程中,您同意并授权我们在下列不同情形,向您收集,用于向您提供服务、优化我们的服务等目 的。

二、我们如何使用信息

为了使您在Udesk提供的服务体验更便捷、顺畅,我们当前已经提供或者未来可能开发的以下功能中可能会收集、使用您的个人信息,您可选择是否授权我们开通以下权限:

(1)基于摄像头(相机)的功能:你需要开启摄像头功能,在满足你在聊天使用拍照和视频聊天的功能
(2)基于相册的功能: 你可能需要开启相册的功能,在你图片,文件上传等功能时, 可以将拍照后的文件存储至本地再进行上传或直接从相册选择图片上传
(3)麦克风权限,用于拍摄视频,支持语音输入。
(4)记录当前登录设备的品牌、型号
(5)基于存储权限的功能,您可能,拍照后的文件存储至本地再进行上传,文件下载,和文件删除
(6)网络状态信息 用于优化与服务端的网络通讯(SSID、BSSID、基站信息),以及检查网络状态
(7)直接拨打电话权限:客服直接联系客户,提高工作效率。
(8)读取/写入剪切板:方便工程师工作时 复制文本内容和粘贴文本内容
上述功能可能需要您在您的设备中向我们开启您的摄像头(相机)录音、相册、直接拨打电话、读写手机存储、设备权限,网路状态等功能的访问权限,以实现这些功能所涉及的信息的收集和使用。您确认并同意开启这些权限即代表您授权我们可以收集和使用这些信息来实现上述功能。
您也可以拒绝授权或遵循您使用设备的操作系统指示关闭相应的权限,在此情况下我们将不再继续收集和使用您的这些信息,也无法为您提供上述与这些权限所对应的功能。但这不会影响您使用平台其他服务产生影响。


相关权限说明
/网络状态权限 sdk内部已经声明
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

使用网络相关权限 应用基础权限,用于网络通讯及检查网络状态

敏感权限如下:(需要在外部声明)
//手机状态权限(机器人语音模块)
<uses-permission android:name="android.permission.READ_PHONE_STATE" />

//读写外部文件权限(相册,文件,位置功能)
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.FLAG_GRANT_READ_URI_PERMISSION" />

//录音权限(语音,拍摄功能)
<uses-permission android:name="android.permission.RECORD_AUDIO" />

//相机相册权限(拍摄,视频会话功能)
<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus" />

三、列外
根据相关法律法规规定,在以下情形中,我们可能会依法共享、转让、公开披露您的个人信息而无需征得您的同意:
(1)为订立、履行您作为一方当事人的合同所必需;
(2)为履行我们的法定职责或者法定义务所必需;
(3)为应对突发公共卫生事件,或者紧急情况下为保护您的生命健康和财产安全所必需;
(4)为公共利益实施新闻报道、舆论监督等行为,在合理的范围内处理您的个人信息;
(5)依照法规规定在合理的范围内处理您自行公开或者其他已经合法公开的您的个人信息;
(6)法律、行政法规规定的其他情形。

四、信息安全
我们已使用符合业界标准的安全防护措施保护您提供的个人信息,防止数据遭到未经授权访问、公开披露、使用、修改、损坏或丢失。
我们会采取一切合理可行的措施,保护您的个人信息,如SSL加密保护,https安全方式。我们会使用受信赖的保护机制防止数据遭到恶意攻击;
我们会部署访问控制机制,确保只有授权人员才可访问个人信息;我们建立专门的管理权限制度、操作规程和组织以保障信息的安全。
我们会尽力保护你的个人信息。 尽管我们有这些安全措施,但请注意在信息网络上不存在“完善的安全措施”。
如您发现自己的个人信息泄密,尤其是您的会员账户或密码发生泄露,您应该立即通过我们提供的联系方式与我们取得联系,以便我们采取相应措施。

五、联系我们
我们设立了专门的个人信息保护团队和个人信息保护负责人,如果你对本隐私政策或个人信息保护相关事宜有任何疑问或投诉、建议时,通过官网(https://www.udesk.cn/)提供联系方式沟通联系沃丰科技。


六、附件SDK平台使用第三方SDK目录
1、SDK名称:fresco图片库
SDK包名:com.facebook.fresco
SDK用途:用于页面加载图片使用。
可能获取的个人信息类型:存储的个人文件。
调用的设备权限:读取外置存储器、写入外置存储器。
SDK隐私政策链接:https://www.fresco-cn.org/
2、 SDK 名称:glide图库
SDK包名:com.bumptech.glide
SDK用途:用于页面加载图片使用。
调用的设备权限:读取外置存储器、写入外置存储器。
SDK隐私政策链接:http://bumptech.github.io/glide/
3、 SDK 名称:gif-drawable
SDK包名:pl.droidsonroids.gif
SDK用途:加载gif图。
调用的设备权限:读取外置存储器、写入外置存储器。
SDK隐私政策链接:https://github.com/koral--/android-gif-drawable

4、SDK名称:okhttp SDK

使用目的:用于实现对服务器API发送请求,下载网络文件,访问网页。

使用方式:发送网络请求。

收集个人数据类型:设备标识符(IMEI、IDFA、MAC等相关信息)、设备参数及系统信息(设备类型、设备型号、操作系统及硬件相关信息)。

第三方隐私政策/官网:https://square.github.io/okhttp/


2 changes: 1 addition & 1 deletion udesksdk/UdeskSDKUI/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -40,5 +40,5 @@ dependencies {
implementation 'com.squareup.okhttp3:okhttp:4.9.0'
implementation group: 'org.ccil.cowan.tagsoup', name: 'tagsoup', version: '1.2.1'
implementation files('libs/udesk-asmack-8-4.0.6.jar')
api files('libs/udesk_sdk_5.4.3.jar')
api files('libs/udesk_sdk_5.4.5.jar')
}
Binary file not shown.
2 changes: 2 additions & 0 deletions udesksdk/UdeskSDKUI/src/main/java/cn/udesk/UdeskUtil.java
Original file line number Diff line number Diff line change
Expand Up @@ -1828,6 +1828,8 @@ public static void sendVideoMessage(ImSetting sdkimSetting, AgentInfo mAgentInfo
UdeskConst.Subdomain = domain;
}

UdeskConst.UniqueId = UdeskSDKManager.getInstance().getSdkToken(context);

// InvokeEventContainer.getInstance().event_OnConnectWebsocket.invoke(context);
}
} catch (Exception e) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,7 @@
import cn.udesk.voice.RecordPlayCallback;
import cn.udesk.widget.RecycleViewDivider;
import cn.udesk.widget.UDPullGetMoreListView;
import cn.udesk.widget.UdeskAppMarketDialog;
import cn.udesk.widget.UdeskConfirmPopWindow;
import cn.udesk.widget.UdeskConfirmPopWindow.OnPopConfirmClick;
import cn.udesk.widget.UdeskExpandableLayout;
Expand Down Expand Up @@ -229,6 +230,47 @@ public class UdeskChatActivity extends UdeskBaseActivity implements IEmotionSele
private boolean isShowNews = true;
private int agentStatus ;

protected UdeskAppMarketDialog marketDialog;

public void disMarketDialog() {
if (marketDialog != null) {
marketDialog.dismiss();
}
}

public void showMarketDialog(final String content) {
showMarketDialog(content,null);
}


public void showMarketDialog(final String content, final View.OnClickListener okClickListener) {

if (UdeskChatActivity.this.isFinishing()) {
return;
}
runOnUiThread(new Runnable() {
@Override
public void run() {
try {
if (marketDialog != null && marketDialog.isShowing()) {
return;
}
marketDialog = new UdeskAppMarketDialog(UdeskChatActivity.this);
marketDialog.setContent(content);
marketDialog.setContentTxtVis(View.VISIBLE);
marketDialog.setCancleTextViewVis(View.GONE);
marketDialog.setOkTxtTextViewVis(View.GONE);
marketDialog.setudeskBottomViewVis(View.GONE);
marketDialog.setCanceledOnTouchOutside(true);
marketDialog.show();
} catch (Exception e) {
e.printStackTrace();
}
}
});

}

public static class MyHandler extends Handler {
WeakReference<UdeskChatActivity> mWeakActivity;

Expand Down Expand Up @@ -1570,25 +1612,40 @@ public void clickCamera() {
if (Build.VERSION.SDK_INT < 23) {
takePhoto();
} else {
XPermissionUtils.requestPermissions(UdeskChatActivity.this, RequestCode.CAMERA,
new String[]{Manifest.permission.CAMERA},
new XPermissionUtils.OnPermissionListener() {
@Override
public void onPermissionGranted() {
takePhoto();
}

@Override
public void onPermissionDenied(String[] deniedPermissions, boolean alwaysDenied) {
UdeskUtils.showToast(getApplicationContext(), getResources().getString(R.string.camera_denied));
}
});
// String clickCamera = PreferenceHelper.readString(getApplicationContext(), "udeks_permission", "clickCamera");
boolean isNeedShowAppMarkDialog = XPermissionUtils.isNeedShowAppMarkDialog(UdeskChatActivity.this,
new String[]{Manifest.permission.CAMERA});
if (isNeedShowAppMarkDialog){
showMarketDialog(getString(R.string.udesk_take_photo_album_permission));
}
requestCameraPermission();
}
} catch (Exception e) {
e.printStackTrace();
}
}

private void requestCameraPermission() {
XPermissionUtils.requestPermissions(UdeskChatActivity.this, RequestCode.CAMERA,
new String[]{Manifest.permission.CAMERA},
new XPermissionUtils.OnPermissionListener() {
@Override
public void onPermissionGranted() {
disMarketDialog();
// PreferenceHelper.write(getApplicationContext(), "udeks_permission", "clickCamera", "true");
takePhoto();
}

@Override
public void onPermissionDenied(String[] deniedPermissions, boolean alwaysDenied) {
disMarketDialog();
// PreferenceHelper.write(getApplicationContext(), "udeks_permission", "clickCamera", "true");
UdeskUtils.showToast(getApplicationContext(), getResources().getString(R.string.camera_denied));
}
});
}


//点击相册入口
public void clickPhoto() {
try {
Expand All @@ -1599,24 +1656,39 @@ public void clickPhoto() {
if (Build.VERSION.SDK_INT >= 33) {
permissions = new String[]{Manifest.permission.READ_MEDIA_IMAGES, Manifest.permission.READ_MEDIA_VIDEO};
}
XPermissionUtils.requestPermissions(UdeskChatActivity.this, RequestCode.EXTERNAL, permissions,
new XPermissionUtils.OnPermissionListener() {
@Override
public void onPermissionGranted() {
selectPhoto();
}

@Override
public void onPermissionDenied(String[] deniedPermissions, boolean alwaysDenied) {
UdeskUtils.showToast(getApplicationContext(), getResources().getString(R.string.photo_denied));
}
});
// String clickPhoto = PreferenceHelper.readString(getApplicationContext(), "udeks_permission", "clickPhoto");
boolean isNeedShowAppMarkDialog = XPermissionUtils.isNeedShowAppMarkDialog(UdeskChatActivity.this, permissions);
if (isNeedShowAppMarkDialog){
showMarketDialog(getString(R.string.udesk_photo_album_permission));
}

requestPhotoPermission(permissions);
}
} catch (Resources.NotFoundException e) {
e.printStackTrace();
}
}

private void requestPhotoPermission(String[] permissions) {
XPermissionUtils.requestPermissions(UdeskChatActivity.this, RequestCode.EXTERNAL, permissions,
new XPermissionUtils.OnPermissionListener() {
@Override
public void onPermissionGranted() {
disMarketDialog();
// PreferenceHelper.write(getApplicationContext(), "udeks_permission", "clickPhoto", "true");
selectPhoto();
}

@Override
public void onPermissionDenied(String[] deniedPermissions, boolean alwaysDenied) {
disMarketDialog();
// PreferenceHelper.write(getApplicationContext(), "udeks_permission", "clickPhoto", "true");
UdeskUtils.showToast(getApplicationContext(), getResources().getString(R.string.photo_denied));
}
});
}

//点击文件入口
public void clickFile() {
try {
Expand All @@ -1627,24 +1699,38 @@ public void clickFile() {
if (Build.VERSION.SDK_INT >= 33) {
permissions = new String[]{Manifest.permission.READ_MEDIA_AUDIO, Manifest.permission.READ_MEDIA_IMAGES, Manifest.permission.READ_MEDIA_VIDEO};
}
XPermissionUtils.requestPermissions(UdeskChatActivity.this, RequestCode.EXTERNAL, permissions,
new XPermissionUtils.OnPermissionListener() {
@Override
public void onPermissionGranted() {
selectFile();
}
// String clickFile = PreferenceHelper.readString(getApplicationContext(), "udeks_permission", "clickFile");
boolean isNeedShowAppMarkDialog = XPermissionUtils.isNeedShowAppMarkDialog(UdeskChatActivity.this, permissions);
if (isNeedShowAppMarkDialog){
showMarketDialog(getString(R.string.udesk_file_storage_permission));
}
requestFilePermission(permissions);

@Override
public void onPermissionDenied(String[] deniedPermissions, boolean alwaysDenied) {
UdeskUtils.showToast(getApplicationContext(), getResources().getString(R.string.file_denied));
}
});
}
} catch (Resources.NotFoundException e) {
e.printStackTrace();
}
}

private void requestFilePermission(String[] permissions) {
XPermissionUtils.requestPermissions(UdeskChatActivity.this, RequestCode.EXTERNAL, permissions,
new XPermissionUtils.OnPermissionListener() {
@Override
public void onPermissionGranted() {
disMarketDialog();
// PreferenceHelper.write(getApplicationContext(), "udeks_permission", "clickFile", "true");
selectFile();
}

@Override
public void onPermissionDenied(String[] deniedPermissions, boolean alwaysDenied) {
disMarketDialog();
// PreferenceHelper.write(getApplicationContext(), "udeks_permission", "clickFile", "true");
UdeskUtils.showToast(getApplicationContext(), getResources().getString(R.string.file_denied));
}
});
}

//点击评价入口
public void clickSurvy() {
try {
Expand Down
Loading

0 comments on commit 0ffbd60

Please sign in to comment.