From bc774ad7b78ac27743e965a9ed938b7e2f1940ff Mon Sep 17 00:00:00 2001 From: liujinan Date: Mon, 11 May 2020 02:05:22 +0800 Subject: [PATCH 01/12] upload vedio and file in android Q. --- .../chatuidemo/domain/VideoEntity.java | 3 ++ .../hyphenate/chatuidemo/ui/ChatFragment.java | 40 ++++++++++++++----- .../chatuidemo/ui/ImageGridFragment.java | 24 +++++++++-- 3 files changed, 54 insertions(+), 13 deletions(-) diff --git a/app/src/main/java/com/hyphenate/chatuidemo/domain/VideoEntity.java b/app/src/main/java/com/hyphenate/chatuidemo/domain/VideoEntity.java index 9cc5e190..f984855a 100644 --- a/app/src/main/java/com/hyphenate/chatuidemo/domain/VideoEntity.java +++ b/app/src/main/java/com/hyphenate/chatuidemo/domain/VideoEntity.java @@ -1,9 +1,12 @@ package com.hyphenate.chatuidemo.domain; +import android.net.Uri; + public class VideoEntity { public int ID; public String title; public String filePath; public int size; public int duration; + public Uri uri; } diff --git a/app/src/main/java/com/hyphenate/chatuidemo/ui/ChatFragment.java b/app/src/main/java/com/hyphenate/chatuidemo/ui/ChatFragment.java index a3c97bdf..9f5cfd09 100644 --- a/app/src/main/java/com/hyphenate/chatuidemo/ui/ChatFragment.java +++ b/app/src/main/java/com/hyphenate/chatuidemo/ui/ChatFragment.java @@ -5,11 +5,14 @@ import android.content.Intent; import android.graphics.Bitmap; import android.graphics.Bitmap.CompressFormat; +import android.media.MediaMetadataRetriever; import android.media.ThumbnailUtils; import android.net.Uri; import android.os.Build; import android.os.Bundle; +import android.os.ParcelFileDescriptor; import android.text.Editable; +import android.text.TextUtils; import android.text.TextWatcher; import android.view.LayoutInflater; import android.view.View; @@ -52,6 +55,7 @@ import java.io.File; import java.io.FileOutputStream; +import java.io.OutputStream; import java.util.List; import java.util.Map; @@ -219,15 +223,33 @@ public void run() { if (data != null) { int duration = data.getIntExtra("dur", 0); String videoPath = data.getStringExtra("path"); - File file = new File(PathUtil.getInstance().getImagePath(), "thvideo" + System.currentTimeMillis()); - try { - FileOutputStream fos = new FileOutputStream(file); - Bitmap ThumbBitmap = ThumbnailUtils.createVideoThumbnail(videoPath, 3); - ThumbBitmap.compress(CompressFormat.JPEG, 100, fos); - fos.close(); - sendVideoMessage(videoPath, file.getAbsolutePath(), duration); - } catch (Exception e) { - e.printStackTrace(); + String uriString = data.getStringExtra("uri"); + if(!TextUtils.isEmpty(videoPath)) { + File file = new File(PathUtil.getInstance().getVideoPath(), "thvideo" + System.currentTimeMillis()); + try { + FileOutputStream fos = new FileOutputStream(file); + Bitmap ThumbBitmap = ThumbnailUtils.createVideoThumbnail(videoPath, 3); + ThumbBitmap.compress(CompressFormat.JPEG, 100, fos); + fos.close(); + sendVideoMessage(videoPath, file.getAbsolutePath(), duration); + } catch (Exception e) { + e.printStackTrace(); + EMLog.e(TAG, e.getMessage()); + } + }else { + Uri videoUri = Uri.parse(uriString); + File file = new File(PathUtil.getInstance().getVideoPath(), "thvideo" + System.currentTimeMillis()); + try { + FileOutputStream fos = new FileOutputStream(file); + MediaMetadataRetriever media = new MediaMetadataRetriever(); + media.setDataSource(getContext(), videoUri); + Bitmap frameAtTime = media.getFrameAtTime(); + frameAtTime.compress(CompressFormat.JPEG, 100, fos); + fos.close(); + sendVideoMessage(videoUri, file.getAbsolutePath(), duration); + } catch (Exception e) { + e.printStackTrace(); + } } } break; diff --git a/app/src/main/java/com/hyphenate/chatuidemo/ui/ImageGridFragment.java b/app/src/main/java/com/hyphenate/chatuidemo/ui/ImageGridFragment.java index f91a014d..5fa57924 100644 --- a/app/src/main/java/com/hyphenate/chatuidemo/ui/ImageGridFragment.java +++ b/app/src/main/java/com/hyphenate/chatuidemo/ui/ImageGridFragment.java @@ -41,6 +41,7 @@ import com.hyphenate.chatuidemo.video.util.ImageResizer; import com.hyphenate.chatuidemo.video.util.Utils; import com.hyphenate.chatuidemo.widget.RecyclingImageView; +import com.hyphenate.easeui.utils.EaseVersionUtils; import com.hyphenate.util.DateUtils; import com.hyphenate.util.EMLog; import com.hyphenate.util.TextFormater; @@ -176,7 +177,12 @@ public void onItemClick(AdapterView parent, View v, final int position, long startActivityForResult(intent, 100); }else{ VideoEntity vEntty=mList.get(position-1); - Intent intent=getActivity().getIntent().putExtra("path", vEntty.filePath).putExtra("dur", vEntty.duration); + Intent intent; + if(EaseVersionUtils.isTargetQ()) { + intent=getActivity().getIntent().putExtra("uri", vEntty.uri.toString()).putExtra("dur", vEntty.duration); + }else { + intent=getActivity().getIntent().putExtra("path", vEntty.filePath).putExtra("dur", vEntty.duration); + } getActivity().setResult(Activity.RESULT_OK, intent); getActivity().finish(); } @@ -300,8 +306,11 @@ private void getVideoFile() String title = cursor.getString(cursor .getColumnIndexOrThrow(MediaStore.Video.Media.TITLE)); // path:MediaStore.Audio.Media.DATA - String url = cursor.getString(cursor - .getColumnIndexOrThrow(MediaStore.Video.Media.DATA)); + String url = null; + if(!EaseVersionUtils.isTargetQ()) { + url = cursor.getString(cursor + .getColumnIndexOrThrow(MediaStore.Video.Media.DATA)); + } // duration:MediaStore.Audio.Media.DURATION int duration = cursor @@ -312,12 +321,15 @@ private void getVideoFile() int size = (int) cursor.getLong(cursor .getColumnIndexOrThrow(MediaStore.Video.Media.SIZE)); + Uri uri = Uri.parse(MediaStore.Video.Media.EXTERNAL_CONTENT_URI.toString() + File.separator + id); + VideoEntity entty = new VideoEntity(); entty.ID = id; entty.title = title; entty.filePath = url; entty.duration = duration; entty.size = size; + entty.uri = uri; mList.add(entty); } while (cursor.moveToNext()); @@ -360,7 +372,11 @@ public void onActivityResult(int requestCode, int resultCode, Intent data) { cursor=null; } - getActivity().setResult(Activity.RESULT_OK, getActivity().getIntent().putExtra("path", filePath).putExtra("dur", duration)); + if(EaseVersionUtils.isTargetQ()) { + getActivity().setResult(Activity.RESULT_OK, getActivity().getIntent().putExtra("uri", uri).putExtra("dur", duration)); + }else { + getActivity().setResult(Activity.RESULT_OK, getActivity().getIntent().putExtra("path", filePath).putExtra("dur", duration)); + } }else { String path = data.getStringExtra("path"); From 92894655e3cc8666d51e494c5e1d9e6ce30bdd5c Mon Sep 17 00:00:00 2001 From: neil Date: Thu, 14 May 2020 18:21:40 +0800 Subject: [PATCH 02/12] update target sdk to 29 and add "android:requestLegacyExternalStorage="true"" in AndroidManifest.xml. --- app/build.gradle | 4 ++-- app/src/main/AndroidManifest.xml | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 2a27e02b..910f8950 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -4,7 +4,7 @@ apply plugin: 'kotlin-android-extensions' apply plugin: 'com.huawei.agconnect' android { - compileSdkVersion 28 + compileSdkVersion 29 buildToolsVersion '28.0.3' defaultConfig { @@ -12,7 +12,7 @@ android { //测试oppo离线消息,需修改包名如下,如果配置了FCM推送,同时替换google-services.json 中的 package_name 字段 //applicationId "com.hyphenate.chatuidemo.push" minSdkVersion 17 - targetSdkVersion 28 + targetSdkVersion 29 multiDexEnabled true ndk { abiFilters 'arm64-v8a', 'armeabi-v7a', 'x86' diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 5c9c0890..2e15ad4c 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -70,6 +70,7 @@ android:allowBackup="true" android:icon="@drawable/em_logo_uidemo" android:usesCleartextTraffic="true" + android:requestLegacyExternalStorage="true" android:label="@string/app_name"> From c39065e09ed864de9ee1782e0e3c87544af4dc6c Mon Sep 17 00:00:00 2001 From: neil Date: Thu, 14 May 2020 18:27:21 +0800 Subject: [PATCH 03/12] adapter 10 for select images. --- .../com/hyphenate/chatuidemo/ui/ChatFragment.java | 14 ++++++++++++-- .../hyphenate/chatuidemo/ui/ImageGridFragment.java | 9 ++++----- 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/com/hyphenate/chatuidemo/ui/ChatFragment.java b/app/src/main/java/com/hyphenate/chatuidemo/ui/ChatFragment.java index 9f5cfd09..c34e15e5 100644 --- a/app/src/main/java/com/hyphenate/chatuidemo/ui/ChatFragment.java +++ b/app/src/main/java/com/hyphenate/chatuidemo/ui/ChatFragment.java @@ -2,7 +2,9 @@ import android.app.Activity; import android.content.ClipData; +import android.content.Context; import android.content.Intent; +import android.content.SharedPreferences; import android.graphics.Bitmap; import android.graphics.Bitmap.CompressFormat; import android.media.MediaMetadataRetriever; @@ -52,6 +54,8 @@ import com.hyphenate.util.EMLog; import com.hyphenate.util.EasyUtils; import com.hyphenate.util.PathUtil; +import com.hyphenate.util.UriUtils; +import com.hyphenate.util.VersionUtils; import java.io.File; import java.io.FileOutputStream; @@ -224,6 +228,7 @@ public void run() { int duration = data.getIntExtra("dur", 0); String videoPath = data.getStringExtra("path"); String uriString = data.getStringExtra("uri"); + EMLog.d(TAG, "path = "+videoPath + " uriString = "+uriString); if(!TextUtils.isEmpty(videoPath)) { File file = new File(PathUtil.getInstance().getVideoPath(), "thvideo" + System.currentTimeMillis()); try { @@ -237,7 +242,7 @@ public void run() { EMLog.e(TAG, e.getMessage()); } }else { - Uri videoUri = Uri.parse(uriString); + Uri videoUri = UriUtils.getLocalUriFromString(uriString); File file = new File(PathUtil.getInstance().getVideoPath(), "thvideo" + System.currentTimeMillis()); try { FileOutputStream fos = new FileOutputStream(file); @@ -379,7 +384,12 @@ public boolean onExtendMenuItemClick(int itemId, View view) { * select file */ protected void selectFileFromLocal() { - Intent intent = new Intent(Intent.ACTION_GET_CONTENT); + Intent intent = new Intent(); + if(VersionUtils.isTargetQ(getActivity())) { + intent.setAction(Intent.ACTION_OPEN_DOCUMENT); + }else { + intent.setAction(Intent.ACTION_GET_CONTENT); + } intent.addCategory(Intent.CATEGORY_OPENABLE); intent.setType("*/*"); diff --git a/app/src/main/java/com/hyphenate/chatuidemo/ui/ImageGridFragment.java b/app/src/main/java/com/hyphenate/chatuidemo/ui/ImageGridFragment.java index 5fa57924..6ced745b 100644 --- a/app/src/main/java/com/hyphenate/chatuidemo/ui/ImageGridFragment.java +++ b/app/src/main/java/com/hyphenate/chatuidemo/ui/ImageGridFragment.java @@ -32,7 +32,6 @@ import android.widget.ImageView; import android.widget.RelativeLayout; import android.widget.TextView; -import android.widget.Toast; import com.hyphenate.chatuidemo.BuildConfig; import com.hyphenate.chatuidemo.R; @@ -41,7 +40,7 @@ import com.hyphenate.chatuidemo.video.util.ImageResizer; import com.hyphenate.chatuidemo.video.util.Utils; import com.hyphenate.chatuidemo.widget.RecyclingImageView; -import com.hyphenate.easeui.utils.EaseVersionUtils; +import com.hyphenate.util.VersionUtils; import com.hyphenate.util.DateUtils; import com.hyphenate.util.EMLog; import com.hyphenate.util.TextFormater; @@ -178,7 +177,7 @@ public void onItemClick(AdapterView parent, View v, final int position, long }else{ VideoEntity vEntty=mList.get(position-1); Intent intent; - if(EaseVersionUtils.isTargetQ()) { + if(VersionUtils.isTargetQ(getContext())) { intent=getActivity().getIntent().putExtra("uri", vEntty.uri.toString()).putExtra("dur", vEntty.duration); }else { intent=getActivity().getIntent().putExtra("path", vEntty.filePath).putExtra("dur", vEntty.duration); @@ -307,7 +306,7 @@ private void getVideoFile() .getColumnIndexOrThrow(MediaStore.Video.Media.TITLE)); // path:MediaStore.Audio.Media.DATA String url = null; - if(!EaseVersionUtils.isTargetQ()) { + if(!VersionUtils.isTargetQ(getContext())) { url = cursor.getString(cursor .getColumnIndexOrThrow(MediaStore.Video.Media.DATA)); } @@ -372,7 +371,7 @@ public void onActivityResult(int requestCode, int resultCode, Intent data) { cursor=null; } - if(EaseVersionUtils.isTargetQ()) { + if(VersionUtils.isTargetQ(getContext())) { getActivity().setResult(Activity.RESULT_OK, getActivity().getIntent().putExtra("uri", uri).putExtra("dur", duration)); }else { getActivity().setResult(Activity.RESULT_OK, getActivity().getIntent().putExtra("path", filePath).putExtra("dur", duration)); From 910a24b12bdb57dab9c43e31f97d5cbc02fee18a Mon Sep 17 00:00:00 2001 From: neil Date: Sun, 17 May 2020 13:24:31 +0800 Subject: [PATCH 04/12] get video duration again if duration is zero. --- app/build.gradle | 4 +-- app/src/main/AndroidManifest.xml | 1 + .../chatuidemo/ui/ImageGridFragment.java | 33 ++++--------------- 3 files changed, 10 insertions(+), 28 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 2a27e02b..910f8950 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -4,7 +4,7 @@ apply plugin: 'kotlin-android-extensions' apply plugin: 'com.huawei.agconnect' android { - compileSdkVersion 28 + compileSdkVersion 29 buildToolsVersion '28.0.3' defaultConfig { @@ -12,7 +12,7 @@ android { //测试oppo离线消息,需修改包名如下,如果配置了FCM推送,同时替换google-services.json 中的 package_name 字段 //applicationId "com.hyphenate.chatuidemo.push" minSdkVersion 17 - targetSdkVersion 28 + targetSdkVersion 29 multiDexEnabled true ndk { abiFilters 'arm64-v8a', 'armeabi-v7a', 'x86' diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 5c9c0890..1458865e 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -70,6 +70,7 @@ android:allowBackup="true" android:icon="@drawable/em_logo_uidemo" android:usesCleartextTraffic="true" + android:requestLegacyExternalStorage="false" android:label="@string/app_name"> diff --git a/app/src/main/java/com/hyphenate/chatuidemo/ui/ImageGridFragment.java b/app/src/main/java/com/hyphenate/chatuidemo/ui/ImageGridFragment.java index 6ced745b..5b09fd50 100644 --- a/app/src/main/java/com/hyphenate/chatuidemo/ui/ImageGridFragment.java +++ b/app/src/main/java/com/hyphenate/chatuidemo/ui/ImageGridFragment.java @@ -40,6 +40,7 @@ import com.hyphenate.chatuidemo.video.util.ImageResizer; import com.hyphenate.chatuidemo.video.util.Utils; import com.hyphenate.chatuidemo.widget.RecyclingImageView; +import com.hyphenate.util.UriUtils; import com.hyphenate.util.VersionUtils; import com.hyphenate.util.DateUtils; import com.hyphenate.util.EMLog; @@ -347,34 +348,14 @@ public void onActivityResult(int requestCode, int resultCode, Intent data) { if(requestCode==100) { Uri uri = data.getParcelableExtra("uri"); if(uri != null) { - String[] projects = new String[] { MediaStore.Video.Media.DATA, - MediaStore.Video.Media.DURATION }; - Cursor cursor = getActivity().getContentResolver().query( - uri, projects, null, - null, null); - int duration=0; - String filePath=null; - - if (cursor.moveToFirst()) { - // path:MediaStore.Audio.Media.DATA - filePath = cursor.getString(cursor - .getColumnIndexOrThrow(MediaStore.Video.Media.DATA)); - // duration:MediaStore.Audio.Media.DURATION - duration = cursor - .getInt(cursor - .getColumnIndexOrThrow(MediaStore.Video.Media.DURATION)); - EMLog.d(TAG, "duration:"+duration); - } - if(cursor!=null) - { - cursor.close(); - cursor=null; - } + String filePath = UriUtils.getFilePath(uri); + int duration = UriUtils.getVideoOrAudioDuration(getActivity(), uri); + EMLog.d(TAG, "duration = "+duration); - if(VersionUtils.isTargetQ(getContext())) { - getActivity().setResult(Activity.RESULT_OK, getActivity().getIntent().putExtra("uri", uri).putExtra("dur", duration)); - }else { + if(!VersionUtils.isTargetQ(getContext()) && !TextUtils.isEmpty(filePath)) { getActivity().setResult(Activity.RESULT_OK, getActivity().getIntent().putExtra("path", filePath).putExtra("dur", duration)); + }else { + getActivity().setResult(Activity.RESULT_OK, getActivity().getIntent().putExtra("uri", uri.toString()).putExtra("dur", duration)); } }else { From 3145acb3520651eebfd1572f0cbcea838aba2aa7 Mon Sep 17 00:00:00 2001 From: liujinan Date: Sun, 24 May 2020 10:14:31 +0800 Subject: [PATCH 05/12] delete apache. --- app/src/main/AndroidManifest.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 1458865e..bafde076 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -73,7 +73,7 @@ android:requestLegacyExternalStorage="false" android:label="@string/app_name"> - + Date: Tue, 2 Jun 2020 15:04:29 +0800 Subject: [PATCH 06/12] modify sandbox address. --- app/src/main/java/com/hyphenate/chatuidemo/DemoHelper.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/com/hyphenate/chatuidemo/DemoHelper.java b/app/src/main/java/com/hyphenate/chatuidemo/DemoHelper.java index f046dd4a..022f9dd0 100644 --- a/app/src/main/java/com/hyphenate/chatuidemo/DemoHelper.java +++ b/app/src/main/java/com/hyphenate/chatuidemo/DemoHelper.java @@ -183,7 +183,7 @@ public void init(Context context) { demoModel = new DemoModel(context); EMOptions options = initChatOptions(context); // options.setRestServer("a1-hsb.easemob.com"); -// options.setIMServer("39.107.54.56"); +// options.setIMServer("116.85.43.118"); // options.setImPort(6717); //use default options if options is null From 596dd2f65864824a9ac3b202f1ad20dd4a44f0f9 Mon Sep 17 00:00:00 2001 From: neil Date: Tue, 2 Jun 2020 15:21:36 +0800 Subject: [PATCH 07/12] update demo version to 3.6.8 --- app/src/main/AndroidManifest.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 361097bc..841780ee 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -2,8 +2,8 @@ + android:versionCode="67" + android:versionName="3.6.8"> @@ -70,7 +70,7 @@ android:allowBackup="true" android:icon="@drawable/em_logo_uidemo" android:usesCleartextTraffic="true" - android:requestLegacyExternalStorage="true" + android:requestLegacyExternalStorage="false" android:label="@string/app_name"> From 62fe4e815aa075233366f40bd385ae139c4d7777 Mon Sep 17 00:00:00 2001 From: neil Date: Thu, 4 Jun 2020 13:17:01 +0800 Subject: [PATCH 08/12] upload group shared file by uri. --- .../chatuidemo/ui/SharedFilesActivity.java | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/app/src/main/java/com/hyphenate/chatuidemo/ui/SharedFilesActivity.java b/app/src/main/java/com/hyphenate/chatuidemo/ui/SharedFilesActivity.java index e5e6593b..b4b4ee26 100644 --- a/app/src/main/java/com/hyphenate/chatuidemo/ui/SharedFilesActivity.java +++ b/app/src/main/java/com/hyphenate/chatuidemo/ui/SharedFilesActivity.java @@ -33,6 +33,8 @@ import com.hyphenate.easeui.model.EaseCompat; import com.hyphenate.util.PathUtil; import com.hyphenate.util.TextFormater; +import com.hyphenate.util.UriUtils; +import com.hyphenate.util.VersionUtils; import java.io.File; import java.util.ArrayList; @@ -281,11 +283,14 @@ public void uploadFile(View view){ */ protected void selectFileFromLocal() { Intent intent = null; - if (Build.VERSION.SDK_INT < 19) { //api 19 and later, we can't use this way, demo just select from images + if(VersionUtils.isTargetQ(this)) { + intent = new Intent(Intent.ACTION_OPEN_DOCUMENT); + intent.setType("*/*"); + intent.addCategory(Intent.CATEGORY_OPENABLE); + }else if (Build.VERSION.SDK_INT < 19) { //api 19 and later, we can't use this way, demo just select from images intent = new Intent(Intent.ACTION_GET_CONTENT); intent.setType("*/*"); intent.addCategory(Intent.CATEGORY_OPENABLE); - } else { intent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); } @@ -308,13 +313,7 @@ protected void onActivityResult(int requestCode, int resultCode, Intent data) { } private void uploadFileWithUri(Uri uri) { - String filePath = getFilePath(uri); - if (filePath == null) { - Toast.makeText(this, "only support upload image when android os >= 4.4", Toast.LENGTH_SHORT).show(); - return; - } - File file = new File(filePath); - if (!file.exists()) { + if(!UriUtils.isFileExistByUri(this, uri)) { Toast.makeText(this, R.string.File_does_not_exist, Toast.LENGTH_SHORT).show(); return; } @@ -322,7 +321,7 @@ private void uploadFileWithUri(Uri uri) { pd.setCanceledOnTouchOutside(false); pd.setMessage("Uploading..."); pd.show(); - EMClient.getInstance().groupManager().asyncUploadGroupSharedFile(groupId, filePath, new EMCallBack() { + EMClient.getInstance().groupManager().asyncUploadGroupSharedFile(groupId, uri.toString(), new EMCallBack() { @Override public void onSuccess() { runOnUiThread(new Runnable() { From 7da5c05fa76c9157ec045176aaf98f8d8c9afa06 Mon Sep 17 00:00:00 2001 From: neil Date: Fri, 5 Jun 2020 18:55:30 +0800 Subject: [PATCH 09/12] fix that can't upload image by group shared layout by android 9. --- .../chatuidemo/ui/SharedFilesActivity.java | 31 ++++++++++--------- 1 file changed, 17 insertions(+), 14 deletions(-) diff --git a/app/src/main/java/com/hyphenate/chatuidemo/ui/SharedFilesActivity.java b/app/src/main/java/com/hyphenate/chatuidemo/ui/SharedFilesActivity.java index b4b4ee26..614cc04c 100644 --- a/app/src/main/java/com/hyphenate/chatuidemo/ui/SharedFilesActivity.java +++ b/app/src/main/java/com/hyphenate/chatuidemo/ui/SharedFilesActivity.java @@ -11,6 +11,7 @@ import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.v4.widget.SwipeRefreshLayout; +import android.text.TextUtils; import android.view.ContextMenu; import android.view.LayoutInflater; import android.view.MenuItem; @@ -282,19 +283,7 @@ public void uploadFile(View view){ * select file */ protected void selectFileFromLocal() { - Intent intent = null; - if(VersionUtils.isTargetQ(this)) { - intent = new Intent(Intent.ACTION_OPEN_DOCUMENT); - intent.setType("*/*"); - intent.addCategory(Intent.CATEGORY_OPENABLE); - }else if (Build.VERSION.SDK_INT < 19) { //api 19 and later, we can't use this way, demo just select from images - intent = new Intent(Intent.ACTION_GET_CONTENT); - intent.setType("*/*"); - intent.addCategory(Intent.CATEGORY_OPENABLE); - } else { - intent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); - } - startActivityForResult(intent, REQUEST_CODE_SELECT_FILE); + EaseCompat.openImage(this, REQUEST_CODE_SELECT_FILE); } @Override @@ -305,13 +294,27 @@ protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (data != null) { Uri uri = data.getData(); if (uri != null) { - uploadFileWithUri(uri); + if(VersionUtils.isTargetQ(this)) { + uploadFileWithUri(uri); + }else { + sendByPath(uri); + } + } } } } } + private void sendByPath(Uri uri) { + String path = EaseCompat.getPath(this, uri); + if(TextUtils.isEmpty(path)) { + Toast.makeText(this, R.string.File_does_not_exist, Toast.LENGTH_SHORT).show(); + return; + } + uploadFileWithUri(Uri.parse(path)); + } + private void uploadFileWithUri(Uri uri) { if(!UriUtils.isFileExistByUri(this, uri)) { Toast.makeText(this, R.string.File_does_not_exist, Toast.LENGTH_SHORT).show(); From ea140bfcd05b3c9b5e83cf2f15e2ac08239a9d57 Mon Sep 17 00:00:00 2001 From: neil Date: Mon, 8 Jun 2020 16:04:53 +0800 Subject: [PATCH 10/12] fix that could not invite admins to join conference. --- .../chatuidemo/conference/ConferenceInviteActivity.kt | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/app/src/main/java/com/hyphenate/chatuidemo/conference/ConferenceInviteActivity.kt b/app/src/main/java/com/hyphenate/chatuidemo/conference/ConferenceInviteActivity.kt index 36f4ad52..07523fea 100644 --- a/app/src/main/java/com/hyphenate/chatuidemo/conference/ConferenceInviteActivity.kt +++ b/app/src/main/java/com/hyphenate/chatuidemo/conference/ConferenceInviteActivity.kt @@ -154,6 +154,12 @@ class ConferenceInviteActivity : BaseActivity() { contactList.addAll(result.data) } } while (result!!.cursor != null && !result.cursor.isEmpty()) + + //获取管理员列表 + val adminList = EMClient.getInstance().groupManager().getGroupFromServer(groupId, true)?.adminList + if (adminList != null) { + contactList.addAll(adminList) + } } runOnUiThread { From 38794f16998574ba046beec895ebffa77850f61f Mon Sep 17 00:00:00 2001 From: neil Date: Mon, 8 Jun 2020 18:39:26 +0800 Subject: [PATCH 11/12] add try catch for get group admins. --- .../chatuidemo/conference/ConferenceInviteActivity.kt | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/com/hyphenate/chatuidemo/conference/ConferenceInviteActivity.kt b/app/src/main/java/com/hyphenate/chatuidemo/conference/ConferenceInviteActivity.kt index 07523fea..63e23e34 100644 --- a/app/src/main/java/com/hyphenate/chatuidemo/conference/ConferenceInviteActivity.kt +++ b/app/src/main/java/com/hyphenate/chatuidemo/conference/ConferenceInviteActivity.kt @@ -156,9 +156,13 @@ class ConferenceInviteActivity : BaseActivity() { } while (result!!.cursor != null && !result.cursor.isEmpty()) //获取管理员列表 - val adminList = EMClient.getInstance().groupManager().getGroupFromServer(groupId, true)?.adminList - if (adminList != null) { - contactList.addAll(adminList) + try { + val adminList = EMClient.getInstance().groupManager().getGroupFromServer(groupId, true)?.adminList + if (adminList != null) { + contactList.addAll(adminList) + } + } catch (e: HyphenateException) { + e.printStackTrace() } } From 48f01ce2d63274881ddccd87597656b525d45235 Mon Sep 17 00:00:00 2001 From: neil Date: Tue, 9 Jun 2020 12:56:10 +0800 Subject: [PATCH 12/12] fix capture screen by androidQ. --- app/src/main/AndroidManifest.xml | 7 ++ .../conference/ConferenceActivity.java | 23 ++++- .../conference/SRForegroundService.java | 84 +++++++++++++++++++ app/src/main/res/values-zh/em_strings.xml | 2 + app/src/main/res/values/em_strings.xml | 2 + 5 files changed, 117 insertions(+), 1 deletion(-) create mode 100644 app/src/main/java/com/hyphenate/chatuidemo/conference/SRForegroundService.java diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 841780ee..e77bb16c 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -65,6 +65,9 @@ + + + + + diff --git a/app/src/main/java/com/hyphenate/chatuidemo/conference/ConferenceActivity.java b/app/src/main/java/com/hyphenate/chatuidemo/conference/ConferenceActivity.java index 48ff4ce5..69f7c08d 100644 --- a/app/src/main/java/com/hyphenate/chatuidemo/conference/ConferenceActivity.java +++ b/app/src/main/java/com/hyphenate/chatuidemo/conference/ConferenceActivity.java @@ -730,7 +730,15 @@ protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (resultCode == RESULT_OK) { if (requestCode == ScreenCaptureManager.RECORD_REQUEST_CODE) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { - ScreenCaptureManager.getInstance().start(resultCode, data); + if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { + Intent service = new Intent(this, SRForegroundService.class); + service.putExtra("code", resultCode); + service.putExtra("data", data); + startForegroundService(service); + }else { + ScreenCaptureManager.getInstance().start(resultCode, data); + } + } } else if (requestCode == REQUEST_CODE_INVITE) { final String[] members = data.getStringArrayExtra("members"); @@ -801,6 +809,7 @@ private void exitConference() { if (ScreenCaptureManager.getInstance().state == ScreenCaptureManager.State.RUNNING) { ScreenCaptureManager.getInstance().stop(); + stopForegroundService(); } // Stop to watch the phone call state. @@ -823,6 +832,16 @@ public void onError(int error, String errorMsg) { }); } + /** + * 停止服务 + */ + private void stopForegroundService() { + if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { + Intent service = new Intent(this, SRForegroundService.class); + stopService(service); + } + } + private void startAudioTalkingMonitor() { EMClient.getInstance().conferenceManager().startMonitorSpeaker(300); } @@ -909,6 +928,7 @@ private void unpublish(String publishId) { if (!TextUtils.isEmpty(conference.getPubStreamId(EMConferenceStream.StreamType.DESKTOP)) && publishId.equals(conference.getPubStreamId(EMConferenceStream.StreamType.DESKTOP))) { ScreenCaptureManager.getInstance().stop(); + stopForegroundService(); } } EMClient.getInstance().conferenceManager().unpublish(publishId, new EMValueCallBack() { @@ -1202,6 +1222,7 @@ public void run() { DeskShareWindow.getInstance(getApplicationContext()).dismiss(); if (ScreenCaptureManager.getInstance().state == ScreenCaptureManager.State.RUNNING) { ScreenCaptureManager.getInstance().stop(); + stopForegroundService(); } // 退出当前界面 finish(); diff --git a/app/src/main/java/com/hyphenate/chatuidemo/conference/SRForegroundService.java b/app/src/main/java/com/hyphenate/chatuidemo/conference/SRForegroundService.java new file mode 100644 index 00000000..2f2b8629 --- /dev/null +++ b/app/src/main/java/com/hyphenate/chatuidemo/conference/SRForegroundService.java @@ -0,0 +1,84 @@ +package com.hyphenate.chatuidemo.conference; + +import android.app.Notification; +import android.app.NotificationChannel; +import android.app.NotificationManager; +import android.app.PendingIntent; +import android.app.Service; +import android.content.Context; +import android.content.Intent; +import android.graphics.BitmapFactory; +import android.media.projection.MediaProjection; +import android.media.projection.MediaProjectionManager; +import android.os.Build; +import android.os.IBinder; +import android.support.annotation.Nullable; +import android.support.annotation.RequiresApi; + +import com.hyphenate.chatuidemo.R; +import com.superrtc.mediamanager.ScreenCaptureManager; + +import java.util.Objects; + +@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) +public class SRForegroundService extends Service { + private int resultCode; + private Intent resultData; + private MediaProjectionManager projectionManager; + private MediaProjection mMediaProjection; + + @Nullable + @Override + public IBinder onBind(Intent intent) { + return null; + } + + @Override + public int onStartCommand(Intent intent, int flags, int startId) { + //启动前置服务 + createNotificationChannel(); + resultCode = intent.getIntExtra("code", -1); + resultData = intent.getParcelableExtra("data"); + + this.projectionManager = (MediaProjectionManager)getSystemService(Context.MEDIA_PROJECTION_SERVICE); + mMediaProjection = projectionManager.getMediaProjection(resultCode, Objects.requireNonNull(resultData)); + + ScreenCaptureManager.getInstance().start(resultCode, resultData, mMediaProjection); + return super.onStartCommand(intent, flags, startId); + } + + private void createNotificationChannel() { + Notification.Builder builder = new Notification.Builder(this.getApplicationContext()); //获取一个Notification构造器 + Intent nfIntent = new Intent(this, ConferenceActivity.class); //点击后跳转的界面,可以设置跳转数据 + + builder.setContentIntent(PendingIntent.getActivity(this, 0, nfIntent, 0)) // 设置PendingIntent + .setLargeIcon(BitmapFactory.decodeResource(this.getResources(), R.drawable.em_logo_uidemo)) // 设置下拉列表中的图标(大图标) + //.setContentTitle("SMI InstantView") // 设置下拉列表里的标题 + .setSmallIcon(R.drawable.em_logo_uidemo) // 设置状态栏内的小图标 + .setContentText(getString(R.string.share_screen_ongoing)) // 设置上下文内容 + .setWhen(System.currentTimeMillis()); // 设置该通知发生的时间 + + /*以下是对Android 8.0的适配*/ + //普通notification适配 + if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + builder.setChannelId("share_screen_id"); + } + //前台服务notification适配 + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + NotificationManager notificationManager = (NotificationManager)getSystemService(NOTIFICATION_SERVICE); + NotificationChannel channel = new NotificationChannel("share_screen_id", "shareScreen", NotificationManager.IMPORTANCE_LOW); + notificationManager.createNotificationChannel(channel); + } + + Notification notification = builder.build(); // 获取构建好的Notification + notification.defaults = Notification.DEFAULT_SOUND; //设置为默认的声音 + startForeground(110, notification); + + } + + @Override + public void onDestroy() { + super.onDestroy(); + stopForeground(true); + } +} diff --git a/app/src/main/res/values-zh/em_strings.xml b/app/src/main/res/values-zh/em_strings.xml index 48772e2c..dbb8bd40 100644 --- a/app/src/main/res/values-zh/em_strings.xml +++ b/app/src/main/res/values-zh/em_strings.xml @@ -456,4 +456,6 @@ %1$s发来视频请求 %1$s发来语音请求 + + 共享屏幕运行中... diff --git a/app/src/main/res/values/em_strings.xml b/app/src/main/res/values/em_strings.xml index f531c7a8..238cb187 100644 --- a/app/src/main/res/values/em_strings.xml +++ b/app/src/main/res/values/em_strings.xml @@ -458,4 +458,6 @@ %1$s sent a video request %1$s sent a voice request + + Shared screen running...