diff --git "a/udesksdk/SDK\351\232\220\347\247\201\346\224\277\347\255\226\346\226\207\346\241\210.txt" "b/udesksdk/SDK\351\232\220\347\247\201\346\224\277\347\255\226\346\226\207\346\241\210.txt" new file mode 100644 index 00000000..1a8eeed0 --- /dev/null +++ "b/udesksdk/SDK\351\232\220\347\247\201\346\224\277\347\255\226\346\226\207\346\241\210.txt" @@ -0,0 +1,97 @@ + + 开发者:北京沃丰时代数据科技有限公司 + 北京沃丰时代数据科技有限公司(以下简称“我们”)尊重并保护用户(以下简称“您”)隐私,在您使用我们服务时,我们将按照本隐私协议收集、存储、使用个人信息。 + 本隐私政策将帮助您了解以下内容: + + 一、我们如何收集信息 + 在您使用的过程中,您同意并授权我们在下列不同情形,向您收集,用于向您提供服务、优化我们的服务等目 的。 + + 二、我们如何使用信息 + + 为了使您在Udesk提供的服务体验更便捷、顺畅,我们当前已经提供或者未来可能开发的以下功能中可能会收集、使用您的个人信息,您可选择是否授权我们开通以下权限: + + (1)基于摄像头(相机)的功能:你需要开启摄像头功能,在满足你在聊天使用拍照和视频聊天的功能 + (2)基于相册的功能: 你可能需要开启相册的功能,在你图片,文件上传等功能时, 可以将拍照后的文件存储至本地再进行上传或直接从相册选择图片上传 + (3)麦克风权限,用于拍摄视频,支持语音输入。 + (4)记录当前登录设备的品牌、型号 + (5)基于存储权限的功能,您可能,拍照后的文件存储至本地再进行上传,文件下载,和文件删除 + (6)网络状态信息 用于优化与服务端的网络通讯(SSID、BSSID、基站信息),以及检查网络状态 + (7)直接拨打电话权限:客服直接联系客户,提高工作效率。 + (8)读取/写入剪切板:方便工程师工作时 复制文本内容和粘贴文本内容 + 上述功能可能需要您在您的设备中向我们开启您的摄像头(相机)录音、相册、直接拨打电话、读写手机存储、设备权限,网路状态等功能的访问权限,以实现这些功能所涉及的信息的收集和使用。您确认并同意开启这些权限即代表您授权我们可以收集和使用这些信息来实现上述功能。 + 您也可以拒绝授权或遵循您使用设备的操作系统指示关闭相应的权限,在此情况下我们将不再继续收集和使用您的这些信息,也无法为您提供上述与这些权限所对应的功能。但这不会影响您使用平台其他服务产生影响。 + + + 相关权限说明 + /网络状态权限 sdk内部已经声明 + + + + + 使用网络相关权限 应用基础权限,用于网络通讯及检查网络状态 + + 敏感权限如下:(需要在外部声明) + //手机状态权限(机器人语音模块) + + + //读写外部文件权限(相册,文件,位置功能) + + + + //录音权限(语音,拍摄功能) + + + //相机相册权限(拍摄,视频会话功能) + + + + + 三、列外 + 根据相关法律法规规定,在以下情形中,我们可能会依法共享、转让、公开披露您的个人信息而无需征得您的同意: + (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/ + + \ No newline at end of file diff --git a/udesksdk/UdeskSDKUI/build.gradle b/udesksdk/UdeskSDKUI/build.gradle index 13ca75cc..712b1cd5 100644 --- a/udesksdk/UdeskSDKUI/build.gradle +++ b/udesksdk/UdeskSDKUI/build.gradle @@ -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') } diff --git a/udesksdk/UdeskSDKUI/libs/udesk_sdk_5.4.3.jar b/udesksdk/UdeskSDKUI/libs/udesk_sdk_5.4.5.jar similarity index 80% rename from udesksdk/UdeskSDKUI/libs/udesk_sdk_5.4.3.jar rename to udesksdk/UdeskSDKUI/libs/udesk_sdk_5.4.5.jar index 3b902b34..762703b7 100644 Binary files a/udesksdk/UdeskSDKUI/libs/udesk_sdk_5.4.3.jar and b/udesksdk/UdeskSDKUI/libs/udesk_sdk_5.4.5.jar differ diff --git a/udesksdk/UdeskSDKUI/src/main/java/cn/udesk/UdeskUtil.java b/udesksdk/UdeskSDKUI/src/main/java/cn/udesk/UdeskUtil.java index eeeec4ae..8509b635 100644 --- a/udesksdk/UdeskSDKUI/src/main/java/cn/udesk/UdeskUtil.java +++ b/udesksdk/UdeskSDKUI/src/main/java/cn/udesk/UdeskUtil.java @@ -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) { diff --git a/udesksdk/UdeskSDKUI/src/main/java/cn/udesk/activity/UdeskChatActivity.java b/udesksdk/UdeskSDKUI/src/main/java/cn/udesk/activity/UdeskChatActivity.java index 81b008f7..43ef89c6 100644 --- a/udesksdk/UdeskSDKUI/src/main/java/cn/udesk/activity/UdeskChatActivity.java +++ b/udesksdk/UdeskSDKUI/src/main/java/cn/udesk/activity/UdeskChatActivity.java @@ -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; @@ -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 mWeakActivity; @@ -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 { @@ -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 { @@ -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 { diff --git a/udesksdk/UdeskSDKUI/src/main/java/cn/udesk/camera/UdeskCameraActivity.java b/udesksdk/UdeskSDKUI/src/main/java/cn/udesk/camera/UdeskCameraActivity.java index 0098974c..a40e72b9 100644 --- a/udesksdk/UdeskSDKUI/src/main/java/cn/udesk/camera/UdeskCameraActivity.java +++ b/udesksdk/UdeskSDKUI/src/main/java/cn/udesk/camera/UdeskCameraActivity.java @@ -13,13 +13,16 @@ import androidx.annotation.NonNull; +import cn.udesk.PreferenceHelper; import cn.udesk.R; import cn.udesk.UdeskUtil; +import cn.udesk.activity.UdeskChatActivity; import cn.udesk.camera.callback.ErrorListener; import cn.udesk.camera.callback.PermissionListener; import cn.udesk.camera.callback.UdeskCameraListener; import cn.udesk.permission.RequestCode; import cn.udesk.permission.XPermissionUtils; +import cn.udesk.widget.UdeskAppMarketDialog; import udesk.core.UdeskConst; /** @@ -30,6 +33,42 @@ public class UdeskCameraActivity extends Activity { UdeskCameraView udeskCameraView; + protected UdeskAppMarketDialog marketDialog; + + public void disMarketDialog() { + if (marketDialog != null) { + marketDialog.dismiss(); + } + } + + public void showMarketDialog(final String content) { + + if (UdeskCameraActivity.this.isFinishing()) { + return; + } + runOnUiThread(new Runnable() { + @Override + public void run() { + try { + if (marketDialog != null && marketDialog.isShowing()) { + return; + } + marketDialog = new UdeskAppMarketDialog(UdeskCameraActivity.this); + marketDialog.setContentTxtVis(View.VISIBLE); + marketDialog.setContent(content); + marketDialog.setCancleTextViewVis(View.GONE); + marketDialog.setOkTxtTextViewVis(View.GONE); + marketDialog.setudeskBottomViewVis(View.GONE); + marketDialog.setCanceledOnTouchOutside(true); + marketDialog.show(); + } catch (Exception e) { + e.printStackTrace(); + } + } + }); + + } + @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -98,22 +137,14 @@ public boolean onCheckAudioPermission() { return true; }else { final boolean[] onPermissionGranted = {false}; - XPermissionUtils.requestPermissions(UdeskCameraActivity.this, RequestCode.AUDIO, - new String[]{Manifest.permission.RECORD_AUDIO}, - new XPermissionUtils.OnPermissionListener() { - @Override - public void onPermissionGranted() { - onPermissionGranted[0] = true; - } - - @Override - public void onPermissionDenied(String[] deniedPermissions, boolean alwaysDenied) { - Toast.makeText(getApplicationContext(), - getResources().getString(R.string.aduido_denied), - Toast.LENGTH_SHORT).show(); - onPermissionGranted[0] = false; - } - }); + +// String clickRecording = PreferenceHelper.readString(getApplicationContext(), "udeks_permission", "Recording"); + boolean isNeedShowAppMarkDialog = XPermissionUtils.isNeedShowAppMarkDialog(UdeskCameraActivity.this, + new String[]{Manifest.permission.RECORD_AUDIO}); + if (isNeedShowAppMarkDialog){ + showMarketDialog(getString(R.string.udesk_voice_permission)); + } + requestAudioPermission(onPermissionGranted); return onPermissionGranted[0]; } } @@ -123,6 +154,29 @@ public void onPermissionDenied(String[] deniedPermissions, boolean alwaysDenied) } } + private void requestAudioPermission(final boolean[] onPermissionGranted) { + XPermissionUtils.requestPermissions(UdeskCameraActivity.this, RequestCode.AUDIO, + new String[]{Manifest.permission.RECORD_AUDIO}, + new XPermissionUtils.OnPermissionListener() { + @Override + public void onPermissionGranted() { + disMarketDialog(); +// PreferenceHelper.write(getApplicationContext(), "udeks_permission", "Recording", "true"); + onPermissionGranted[0] = true; + } + + @Override + public void onPermissionDenied(String[] deniedPermissions, boolean alwaysDenied) { + disMarketDialog(); +// PreferenceHelper.write(getApplicationContext(), "udeks_permission", "Recording", "true"); + Toast.makeText(getApplicationContext(), + getResources().getString(R.string.aduido_denied), + Toast.LENGTH_SHORT).show(); + onPermissionGranted[0] = false; + } + }); + } + @Override protected void onResume() { super.onResume(); diff --git a/udesksdk/UdeskSDKUI/src/main/java/cn/udesk/fragment/UdeskAgentFragment.java b/udesksdk/UdeskSDKUI/src/main/java/cn/udesk/fragment/UdeskAgentFragment.java index df89571e..998906be 100644 --- a/udesksdk/UdeskSDKUI/src/main/java/cn/udesk/fragment/UdeskAgentFragment.java +++ b/udesksdk/UdeskSDKUI/src/main/java/cn/udesk/fragment/UdeskAgentFragment.java @@ -22,10 +22,12 @@ import java.util.ArrayList; import java.util.List; +import cn.udesk.PreferenceHelper; import cn.udesk.R; import cn.udesk.UdeskSDKManager; import cn.udesk.UdeskUtil; import cn.udesk.activity.NavigationFragment; +import cn.udesk.activity.UdeskChatActivity; import cn.udesk.adapter.UdeskFunctionAdapter; import cn.udesk.config.UdeskConfig; import cn.udesk.emotion.EmotionKeyboard; @@ -147,22 +149,13 @@ public boolean getPermission() { return true; }else { final boolean[] onPermissionGranted = {false}; - XPermissionUtils.requestPermissions(udeskChatActivity, RequestCode.AUDIO, - new String[]{Manifest.permission.RECORD_AUDIO}, - new XPermissionUtils.OnPermissionListener() { - @Override - public void onPermissionGranted() { - onPermissionGranted[0] = true; - } - - @Override - public void onPermissionDenied(String[] deniedPermissions, boolean alwaysDenied) { - Toast.makeText(udeskChatActivity.getApplicationContext(), - getResources().getString(R.string.aduido_denied), - Toast.LENGTH_SHORT).show(); - onPermissionGranted[0] = false; - } - }); +// String clickRecording = PreferenceHelper.readString(udeskChatActivity.getApplicationContext(), "udeks_permission", "Recording"); + boolean isNeedShowAppMarkDialog = XPermissionUtils.isNeedShowAppMarkDialog(udeskChatActivity, + new String[]{Manifest.permission.RECORD_AUDIO}); + if (isNeedShowAppMarkDialog){ + udeskChatActivity.showMarketDialog(getString(R.string.udesk_voice_permission)); + } + requestAudioPermission(onPermissionGranted); return onPermissionGranted[0]; } } @@ -200,6 +193,29 @@ public void recordError(String message) { } + private void requestAudioPermission(final boolean[] onPermissionGranted) { + XPermissionUtils.requestPermissions(udeskChatActivity, RequestCode.AUDIO, + new String[]{Manifest.permission.RECORD_AUDIO}, + new XPermissionUtils.OnPermissionListener() { + @Override + public void onPermissionGranted() { + udeskChatActivity.disMarketDialog(); +// PreferenceHelper.write(udeskChatActivity.getApplicationContext(), "udeks_permission", "Recording", "true"); + onPermissionGranted[0] = true; + } + + @Override + public void onPermissionDenied(String[] deniedPermissions, boolean alwaysDenied) { + udeskChatActivity.disMarketDialog(); +// PreferenceHelper.write(udeskChatActivity.getApplicationContext(), "udeks_permission", "Recording", "true"); + Toast.makeText(udeskChatActivity.getApplicationContext(), + getResources().getString(R.string.aduido_denied), + Toast.LENGTH_SHORT).show(); + onPermissionGranted[0] = false; + } + }); + } + /** * emoji的显示隐藏 */ diff --git a/udesksdk/UdeskSDKUI/src/main/java/cn/udesk/messagemanager/UdeskXmppManager.java b/udesksdk/UdeskSDKUI/src/main/java/cn/udesk/messagemanager/UdeskXmppManager.java index f4de98e1..f46f5ab7 100644 --- a/udesksdk/UdeskSDKUI/src/main/java/cn/udesk/messagemanager/UdeskXmppManager.java +++ b/udesksdk/UdeskSDKUI/src/main/java/cn/udesk/messagemanager/UdeskXmppManager.java @@ -541,7 +541,7 @@ private void processMessage(Message message) { } if (json.has("seq_num")) { - seq_num = json.getInt("seq_num"); + seq_num = UdeskUtils.objectToInt(json.opt("seq_num")); } if (json.has("im_sub_session_id")) { diff --git a/udesksdk/UdeskSDKUI/src/main/java/cn/udesk/permission/XPermissionUtils.java b/udesksdk/UdeskSDKUI/src/main/java/cn/udesk/permission/XPermissionUtils.java index 5daa1141..b08ed37d 100644 --- a/udesksdk/UdeskSDKUI/src/main/java/cn/udesk/permission/XPermissionUtils.java +++ b/udesksdk/UdeskSDKUI/src/main/java/cn/udesk/permission/XPermissionUtils.java @@ -28,6 +28,21 @@ public interface OnPermissionListener { void onPermissionDenied(String[] deniedPermissions, boolean alwaysDenied); } + @TargetApi(Build.VERSION_CODES.M) + public static boolean isNeedShowAppMarkDialog(Activity activity, String[] permissions) { + try { + String[] deniedPermissions = getDeniedPermissions(activity, permissions); + if (deniedPermissions.length > 0 && Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { +// boolean alwaysDenied = hasAlwaysDeniedPermission(activity, permissions); + return true; + } + } catch (Exception e) { + e.printStackTrace(); + } + return false; + } + + @TargetApi(Build.VERSION_CODES.M) public static void requestPermissionsAgain(Activity activity, String[] permissions, int requestCode) { diff --git a/udesksdk/UdeskSDKUI/src/main/java/cn/udesk/photoselect/PhotoSelectorActivity.java b/udesksdk/UdeskSDKUI/src/main/java/cn/udesk/photoselect/PhotoSelectorActivity.java index e401c9fc..64583af3 100644 --- a/udesksdk/UdeskSDKUI/src/main/java/cn/udesk/photoselect/PhotoSelectorActivity.java +++ b/udesksdk/UdeskSDKUI/src/main/java/cn/udesk/photoselect/PhotoSelectorActivity.java @@ -10,6 +10,7 @@ import android.content.res.Resources; import android.os.Build; import android.os.Bundle; +import android.text.TextUtils; import android.view.View; import android.view.WindowManager; import android.view.animation.AccelerateDecelerateInterpolator; @@ -29,8 +30,11 @@ import java.util.ArrayList; import java.util.List; +import cn.udesk.PreferenceHelper; import cn.udesk.R; import cn.udesk.UdeskUtil; +import cn.udesk.activity.UdeskChatActivity; +import cn.udesk.camera.UdeskCameraActivity; import cn.udesk.permission.RequestCode; import cn.udesk.permission.XPermissionUtils; import cn.udesk.photoselect.adapter.FolderAdapter; @@ -38,6 +42,7 @@ import cn.udesk.photoselect.decoration.GridSpacingItemDecoration; import cn.udesk.photoselect.entity.LocalMedia; import cn.udesk.photoselect.entity.LocalMediaFolder; +import cn.udesk.widget.UdeskAppMarketDialog; import udesk.core.UdeskConst; /** @@ -73,6 +78,43 @@ public class PhotoSelectorActivity extends FragmentActivity implements View.OnCl int disPlayWidth; int disPlayHeghit; + protected UdeskAppMarketDialog marketDialog; + + public void disMarketDialog() { + if (marketDialog != null) { + marketDialog.dismiss(); + } + } + + public void showMarketDialog(final String content) { + + if (PhotoSelectorActivity.this.isFinishing()) { + return; + } + runOnUiThread(new Runnable() { + @Override + public void run() { + try { + if (marketDialog != null && marketDialog.isShowing()) { + return; + } + marketDialog = new UdeskAppMarketDialog(PhotoSelectorActivity.this); + marketDialog.setContentTxtVis(View.VISIBLE); + marketDialog.setContent(content); + marketDialog.setCancleTextViewVis(View.GONE); + marketDialog.setOkTxtTextViewVis(View.GONE); + marketDialog.setudeskBottomViewVis(View.GONE); + marketDialog.setCanceledOnTouchOutside(true); + marketDialog.show(); + } catch (Exception e) { + e.printStackTrace(); + } + } + }); + + } + + @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -134,20 +176,12 @@ public void onClick(View view) { if (Build.VERSION.SDK_INT >= 33) { permissions = new String[]{Manifest.permission.READ_MEDIA_IMAGES, Manifest.permission.READ_MEDIA_VIDEO}; } - XPermissionUtils.requestPermissions(PhotoSelectorActivity.this, RequestCode.EXTERNAL, permissions, - new XPermissionUtils.OnPermissionListener() { - @Override - public void onPermissionGranted() { - readLocalMedia(); - } - - @Override - public void onPermissionDenied(String[] deniedPermissions, boolean alwaysDenied) { - Toast.makeText(getApplicationContext(), - getResources().getString(R.string.photo_denied), - Toast.LENGTH_SHORT).show(); - } - }); +// String clickPhoto = PreferenceHelper.readString(getApplicationContext(), "udeks_permission", "clickPhoto"); + boolean isNeedShowAppMarkDialog = XPermissionUtils.isNeedShowAppMarkDialog(PhotoSelectorActivity.this, permissions); + if (isNeedShowAppMarkDialog){ + showMarketDialog(getString(R.string.udesk_photo_album_permission)); + } + requestPhotoPermission(permissions); } setViewEneable(); } catch (Exception e) { @@ -155,6 +189,27 @@ public void onPermissionDenied(String[] deniedPermissions, boolean alwaysDenied) } } + private void requestPhotoPermission(String[] permissions) { + XPermissionUtils.requestPermissions(PhotoSelectorActivity.this, RequestCode.EXTERNAL, permissions, + new XPermissionUtils.OnPermissionListener() { + @Override + public void onPermissionGranted() { + disMarketDialog(); +// PreferenceHelper.write(getApplicationContext(), "udeks_permission", "clickPhoto", "true"); + readLocalMedia(); + } + + @Override + public void onPermissionDenied(String[] deniedPermissions, boolean alwaysDenied) { + disMarketDialog(); +// PreferenceHelper.write(getApplicationContext(), "udeks_permission", "clickPhoto", "true"); + Toast.makeText(getApplicationContext(), + getResources().getString(R.string.photo_denied), + Toast.LENGTH_SHORT).show(); + } + }); + } + @Override public void onClick(View view) { diff --git a/udesksdk/UdeskSDKUI/src/main/java/cn/udesk/widget/UdeskAppMarketDialog.java b/udesksdk/UdeskSDKUI/src/main/java/cn/udesk/widget/UdeskAppMarketDialog.java new file mode 100644 index 00000000..fed0d28e --- /dev/null +++ b/udesksdk/UdeskSDKUI/src/main/java/cn/udesk/widget/UdeskAppMarketDialog.java @@ -0,0 +1,85 @@ +package cn.udesk.widget; + +import android.app.Dialog; +import android.content.Context; +import android.text.TextUtils; +import android.text.method.ScrollingMovementMethod; +import android.view.Gravity; +import android.view.LayoutInflater; +import android.view.View; +import android.widget.TextView; + +import cn.udesk.R; + +public class UdeskAppMarketDialog extends Dialog { + + private TextView okTxt, cancleTxt, titleTxt, contentTxt; + private View udeskBottom; + + public UdeskAppMarketDialog(Context context) { + super(context, R.style.udesk_app_market_dialog); + getWindow().setGravity(Gravity.TOP); + setCustomDialog(); + } + + private void setCustomDialog() { + View mView = LayoutInflater.from(getContext()).inflate(R.layout.udesk_app_market_dialog_define_view, null); + + okTxt = (TextView) mView.findViewById(R.id.udesk_ok); + cancleTxt = (TextView) mView.findViewById(R.id.udesk_cancle); + titleTxt = (TextView) mView.findViewById(R.id.udesk_title); + contentTxt = (TextView) mView.findViewById(R.id.udesk_content); + udeskBottom = mView.findViewById(R.id.udesk_bottom_rl); + contentTxt.setMovementMethod(ScrollingMovementMethod.getInstance()); + super.setContentView(mView); + } + + public void setTitleViewVis(int vis) { + titleTxt.setVisibility(vis); + } + + public void setTitle(String s) { + titleTxt.setText(s); + } + + + public void setCancleTextViewVis(int vis) { + cancleTxt.setVisibility(vis); + } + + public void setOkAndCancelTxt(String ok, String cancle) { + if (okTxt != null && !TextUtils.isEmpty(ok)) { + okTxt.setText(ok); + } + if (cancleTxt != null && !TextUtils.isEmpty(cancle)) { + cancleTxt.setText(cancle); + } + } + + public void setContent(String s) { + contentTxt.setText(s); + } + + public void setContentTxtVis(int vis) { + contentTxt.setVisibility(View.VISIBLE); + } + + //设置确定监听事件 + public void setOkTextViewOnclick(View.OnClickListener listener) { + okTxt.setOnClickListener(listener); + } + + //设置取消监听事件 + public void setCancleTextViewOnclick(View.OnClickListener listener) { + cancleTxt.setOnClickListener(listener); + } + + public void setOkTxtTextViewVis(int vis) { + okTxt.setVisibility(vis); + } + + public void setudeskBottomViewVis(int vis) { + udeskBottom.setVisibility(vis); + } + +} diff --git a/udesksdk/UdeskSDKUI/src/main/res/drawable/udesk_white_bg.xml b/udesksdk/UdeskSDKUI/src/main/res/drawable/udesk_white_bg.xml new file mode 100644 index 00000000..81fdce87 --- /dev/null +++ b/udesksdk/UdeskSDKUI/src/main/res/drawable/udesk_white_bg.xml @@ -0,0 +1,11 @@ + + + + + + + + + diff --git a/udesksdk/UdeskSDKUI/src/main/res/layout/udesk_app_market_dialog_define_view.xml b/udesksdk/UdeskSDKUI/src/main/res/layout/udesk_app_market_dialog_define_view.xml new file mode 100644 index 00000000..a7a03ff5 --- /dev/null +++ b/udesksdk/UdeskSDKUI/src/main/res/layout/udesk_app_market_dialog_define_view.xml @@ -0,0 +1,74 @@ + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/udesksdk/UdeskSDKUI/src/main/res/values-en/udesk_strings.xml b/udesksdk/UdeskSDKUI/src/main/res/values-en/udesk_strings.xml index 9d8fc49b..6e697767 100644 --- a/udesksdk/UdeskSDKUI/src/main/res/values-en/udesk_strings.xml +++ b/udesksdk/UdeskSDKUI/src/main/res/values-en/udesk_strings.xml @@ -155,5 +155,11 @@ The file has been downloaded The file is downloading + After authorization, you can quickly contact customer service by making a phone call + After authorization, you can obtain permission to access the photo album, and you can send the pictures in the photo album to customer service to accurately describe the problem + After authorization, you can take a photo to generate a picture and send it to customer service + After authorization, the pictures generated by taking photos can be saved in the memory card for subsequent viewing + After authorization to obtain permission to access files, you can choose to send the files in your mobile phone directly to customer service + After authorization, you can send voice content to customer service to express problems quickly and accurately diff --git a/udesksdk/UdeskSDKUI/src/main/res/values-zh/udesk_strings.xml b/udesksdk/UdeskSDKUI/src/main/res/values-zh/udesk_strings.xml index 9cfd7ffe..ac7f5f46 100644 --- a/udesksdk/UdeskSDKUI/src/main/res/values-zh/udesk_strings.xml +++ b/udesksdk/UdeskSDKUI/src/main/res/values-zh/udesk_strings.xml @@ -156,5 +156,10 @@ 文件已下载 文件正在下载中... - + 授权后可通过拨打电话的方式快捷联系客服 + 授权后获取访问相册的权限,可将相册中的图片发送给客服,准确描述问题 + 授权后可通过拍照方式生成图片并发给客服 + 授权后可将拍照生成的图片保存在存储卡中,方便后续查看 + 授权后获取访问文件的权限,可选择手机中文件直接发送给客服 + 授权后可给客服发送语音内容,方便快速准确的表达问题 \ No newline at end of file diff --git a/udesksdk/UdeskSDKUI/src/main/res/values/udesk_colors.xml b/udesksdk/UdeskSDKUI/src/main/res/values/udesk_colors.xml index 3835a6d3..c34fdbf2 100644 --- a/udesksdk/UdeskSDKUI/src/main/res/values/udesk_colors.xml +++ b/udesksdk/UdeskSDKUI/src/main/res/values/udesk_colors.xml @@ -104,6 +104,9 @@ #b3212121 #66212121 #D7D7D7 + #ffffff + #adadad + #007aff #ccc #fff diff --git a/udesksdk/UdeskSDKUI/src/main/res/values/udesk_strings.xml b/udesksdk/UdeskSDKUI/src/main/res/values/udesk_strings.xml index a3559b5b..dffd18d2 100644 --- a/udesksdk/UdeskSDKUI/src/main/res/values/udesk_strings.xml +++ b/udesksdk/UdeskSDKUI/src/main/res/values/udesk_strings.xml @@ -157,4 +157,10 @@ 文件已下载 文件正在下载中... + 授权后可通过拨打电话的方式快捷联系客服 + 授权后获取访问相册的权限,可将相册中的图片发送给客服,准确描述问题 + 授权后可通过拍照方式生成图片并发给客服 + 授权后可将拍照生成的图片保存在存储卡中,方便后续查看 + 授权后获取访问文件的权限,可选择手机中文件直接发送给客服 + 授权后可给客服发送语音内容,方便快速准确的表达问题 \ No newline at end of file diff --git a/udesksdk/UdeskSDKUI/src/main/res/values/udesk_styles.xml b/udesksdk/UdeskSDKUI/src/main/res/values/udesk_styles.xml index ca2bb614..e789d882 100644 --- a/udesksdk/UdeskSDKUI/src/main/res/values/udesk_styles.xml +++ b/udesksdk/UdeskSDKUI/src/main/res/values/udesk_styles.xml @@ -57,4 +57,11 @@ @android:color/transparent + + \ No newline at end of file diff --git a/udesksdk/udeskvideo/src/main/java/udesk/udesksocket/Util.java b/udesksdk/udeskvideo/src/main/java/udesk/udesksocket/Util.java index a4ea9e05..86c17608 100644 --- a/udesksdk/udeskvideo/src/main/java/udesk/udesksocket/Util.java +++ b/udesksdk/udeskvideo/src/main/java/udesk/udesksocket/Util.java @@ -52,11 +52,12 @@ public static synchronized String buildMsgId() { } public static String getUniqueId(Context context) { - String androidID = ""; - if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.CUPCAKE) { - androidID = Settings.Secure.getString(context.getContentResolver(), Settings.Secure.ANDROID_ID); - } - return androidID + Build.SERIAL; +// String androidID = ""; +// if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.CUPCAKE) { +// androidID = Settings.Secure.getString(context.getContentResolver(), Settings.Secure.ANDROID_ID); +// } +// return androidID + Build.SERIAL; + return UdeskConst.UniqueId; } public static String getUa() {