huangxinbao

fix sdk mistake on repair end cap off teachers

正在显示 100 个修改的文件 包含 498 行增加542 行删除

要显示太多修改。

为保证性能只显示 100 of 100+ 个文件。

apply plugin: 'com.android.application'
android {
compileSdkVersion 25
buildToolsVersion '25.0.2'
aaptOptions.cruncherEnabled = false
aaptOptions.useNewCruncher = false
defaultConfig {
applicationId "com.mang.xdy.demo"
minSdkVersion 15
targetSdkVersion 22
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
//是否混淆
minifyEnabled false
zipAlignEnabled true
// shrinkResources true//去除无用的resource文件,第一次使用
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
repositories {
flatDir {
dirs 'libs'
}
}
}
dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs')
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
exclude group: 'com.android.support', module: 'support-annotations'
})
compile files('libs/pldroid-player-1.5.1.jar')
compile 'com.android.support:appcompat-v7:25.3.1'
compile 'com.jakewharton:butterknife:8.5.1'
compile 'com.android.support:design:25.3.1'
compile 'com.squareup.picasso:picasso:2.3.2'
compile 'com.github.bumptech.glide:glide:3.7.0'
compile 'com.rockerhieu.emojicon:library:1.3.1'
compile 'org.kymjs.kjframe:kjframe:2.6'
compile 'io.reactivex:rxjava:1.0.9'
compile 'io.reactivex:rxandroid:0.24.0'
// compile 'com.squareup.retrofit:retrofit:1.9.0'
compile 'com.nineoldandroids:library:2.4.0'
compile 'me.yokeyword:fragmentation:0.10.3'
compile 'com.qiniu:happy-dns:0.2.+'
// compile 'com.android.support:support-v4:25.3.1'
testCompile 'junit:junit:4.12'
annotationProcessor 'com.jakewharton:butterknife-compiler:8.5.1'
compile 'com.qiniu:happy-dns:0.2.+'
compile 'org.greenrobot:eventbus:3.0.0'
compile 'com.flyco.tablayout:FlycoTabLayout_Lib:2.1.2@aar'
compile project(':iOS_Dialog_Library')
compile project(':xdy')
}
# Add project specific ProGuard rules here.
# By default, the flags in this file are appended to flags specified
# in D:\sdk/tools/proguard/proguard-android.txt
# You can edit the include path and order by changing the proguardFiles
# directive in build.gradle.
#
# For more details, see
# http://developer.android.com/guide/developing/tools/proguard.html
# Add any project specific keep options here:
# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
# public *;
#}
-keep class com.eventhandle.**{*;}
-keep class com.ntjbase.**{*;}
-keep class com.videoengine.**{*;}
-keep class com.voiceengine.**{*;}
-keep class com.mang.xdy.**{*;}
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingLeft="10dp"
android:paddingRight="10dp">
<LinearLayout
android:id="@+id/chat_menu_images"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp"
android:layout_marginTop="10dp"
android:clickable="true"
android:focusable="false"
android:orientation="vertical">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="5dp"
android:text="图片"/>
</LinearLayout>
<LinearLayout
android:id="@+id/chat_menu_photo"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp"
android:layout_marginTop="10dp"
android:layout_toRightOf="@id/chat_menu_images"
android:clickable="true"
android:focusable="false"
android:orientation="vertical">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="5dp"
android:text="拍照"/>
</LinearLayout>
</RelativeLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<LinearLayout
android:layout_width="@dimen/ui_DIMEN_500.0PX"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:background="@drawable/radius_solid_white_stroke_999"
android:gravity="center_horizontal"
android:orientation="vertical"
android:paddingBottom="@dimen/ui_DIMEN_20.0PX">
<EditText
android:id="@+id/et_username"
style="@style/home_login_edit_style"
android:hint="@string/home_enter_username"/>
<EditText
android:id="@+id/et_password"
style="@style/home_login_edit_style"
android:hint="@string/home_enter_password"
android:inputType="textPassword"
android:visibility="gone"/>
<Button
android:id="@+id/btn_login"
style="@style/home_site_btn_style"
android:text="@string/home_enter_login"
android:textColor="@color/white"/>
</LinearLayout>
</RelativeLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<ImageView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@mipmap/gradient_play"/>
<RelativeLayout
android:paddingLeft="@dimen/ui_DIMEN_20.0PX"
android:id="@+id/rl_operation_play"
android:layout_width="@dimen/ui_DIMEN_70.0PX"
android:layout_centerVertical="true"
android:layout_height="@dimen/ui_DIMEN_70.0PX">
<ImageButton
android:layout_marginLeft="@dimen/ui_DIMEN_20.0PX"
android:id="@+id/iv_operation_play"
android:layout_width="wrap_content"
android:layout_centerInParent="true"
android:layout_height="wrap_content"
android:background="@null"
android:src="@mipmap/play"/>
</RelativeLayout>
<RelativeLayout
android:id="@+id/rl_meadia_contriller_right"
android:gravity="center"
android:layout_toRightOf="@id/rl_operation_play"
android:layout_width="match_parent"
android:layout_marginTop="@dimen/ui_DIMEN_6.0PX"
android:layout_height="@dimen/ui_DIMEN_70.0PX">
<TextView
android:id="@+id/tv_current_time"
style="@style/ui_wrapTvBaseStyle"
android:minWidth="@dimen/ui_DIMEN_100.0PX"
android:textColor="@color/white"
android:gravity="end"
tools:text="12:00:12"/>
<TextView
android:id="@+id/tv_end_time"
style="@style/ui_wrapTvBaseStyle"
android:layout_alignParentRight="true"
android:layout_marginRight="@dimen/ui_DIMEN_30.0PX"
android:textColor="@color/white"
tools:text="12:00"/>
<SeekBar
android:id="@+id/sb_live"
style="@style/home_seek_bar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_toLeftOf="@id/tv_end_time"
android:layout_toRightOf="@id/tv_current_time"/>
</RelativeLayout>
</RelativeLayout>
\ No newline at end of file
<resources>
<string name="app_name">学点云</string>
<!-- TODO: Remove or change this placeholder text -->
<string name="hello_blank_fragment">Hello blank fragment</string>
<string name="home_classid_hint">classid</string>
<string name="home_role_hint">userRole</string>
<string name="home_userid_hint">userid</string>
<string name="home_portal_hint">portal</string>
<string name="home_enter_class">Enter the classroom</string>
<string name="home_enter_replay">Enter the recording playback</string>
<string name="home_enter_login">Sign in</string>
<string name="home_enter_password">password</string>
<string name="home_enter_username">username</string>
<string name="home_content_doc">Document</string>
<string name="home_content_chat">Chat</string>
<string name="home_dialog_pushAudio">Push Audio</string>
<string name="home_dialog_pushVideo">Push Video</string>
<string name="home_dialog_selectList">Selective listing</string>
<string name="home_msg_leave_character">Sign out</string>
<string name="home_msg_leave_class_whether">Are you sure you want to end the current class?</string>
<string name="home_msg_exit_class">Have dropped out of the classroom</string>
<string name="home_msg_leave_no">NO</string>
<string name="home_msg_leave_yes">YES</string>
<string name="home_msg_loading">loading</string>
<string name="home_msg_join_class_success">Joining classroom Success</string>
<string name="home_msg_error_net_disconnection">The device network belongs to the off state, please re-enter</string>
<string name="home_msg_verify">Determine</string>
<string name="home_title_back">Back</string>
<string name="home_msg_play_audio_init">Audio playback initialization</string>
<string name="home_msg_play_video_init">Video playback initialization</string>
<string name="imge_load_error">Pictures for failure</string>
<!--登录-->
<string name="main_login_error_classId">Please enter class number</string>
<string name="main_login_error_portal">Please enter portal</string>
<string name="main_login_error_role">Please enter role</string>
<string name="main_login_error_userId">Please enter userId</string>
</resources>
<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="home_PagerSlidingTabStrip">
<attr name="home_pstsIndicatorColor" format="color"/>
<attr name="home_pstsUnderlineColor" format="color"/>
<attr name="home_pstsDividerColor" format="color"/>
<attr name="home_pstsIndicatorHeight" format="dimension"/>
<attr name="home_pstsUnderlineHeight" format="dimension"/>
<attr name="home_pstsDividerPadding" format="dimension"/>
<attr name="home_pstsTabPaddingLeftRight" format="dimension"/>
<attr name="home_pstsScrollOffset" format="dimension"/>
<attr name="home_pstsTabBackground" format="reference"/>
<attr name="home_pstsShouldExpand" format="boolean"/>
<attr name="home_pstsTextAllCaps" format="boolean"/>
</declare-styleable>
</resources>
\ No newline at end of file
<resources>
<!-- Default screen margins, per the Android Design guidelines. -->
<dimen name="activity_horizontal_margin">16dp</dimen>
<dimen name="activity_vertical_margin">16dp</dimen>
<!-- yalantis -->
<dimen name="ui_refresh_header_height_yalantis">136dp</dimen>
<!-- jd -->
<dimen name="ui_refresh_header_height_jd">100dp</dimen>
<!-- 标题栏高度 -->
<dimen name="ui_titlebar_height">@dimen/ui_DIMEN_96.0PX</dimen>
<!-- 默认内边距 -->
<dimen name="ui_default_padding">@dimen/ui_DIMEN_20.0PX</dimen>
<!-- 收货地址默认内边距 -->
<dimen name="ui_address_padding">@dimen/ui_DIMEN_40.0PX</dimen>
<!-- Navigator的高度 -->
<dimen name="ui_navigator_height">@dimen/ui_DIMEN_98.0PX</dimen>
<!-- 设置里每一个ITEM的高度 -->
<dimen name="ui_setting_item_height">@dimen/ui_DIMEN_102.0PX</dimen>
<!-- 边框的角度 -->
<dimen name="ui_general_stroke_radius">8px</dimen>
<!-- 边框的宽度 -->
<dimen name="ui_general_stroke_width">1px</dimen>
<dimen name="ui_xxs_font_size">@dimen/ui_DIMEN_20.0PX</dimen>
<dimen name="ui_xs_font_size">@dimen/ui_DIMEN_22.0PX</dimen>
<dimen name="ui_s_font_size">@dimen/ui_DIMEN_24.0PX</dimen>
<dimen name="ui_m_font_size">@dimen/ui_DIMEN_26.0PX</dimen>
<dimen name="ui_l_font_size">@dimen/ui_DIMEN_28.0PX</dimen>
<dimen name="ui_xl_font_size">@dimen/ui_DIMEN_30.0PX</dimen>
<dimen name="ui_xxl_font_size">@dimen/ui_DIMEN_32.0PX</dimen>
<dimen name="ui_xxxl_font_size">@dimen/ui_DIMEN_34.0PX</dimen>
<dimen name="ui_xxxxl_font_size">@dimen/ui_DIMEN_36.0PX</dimen>
<dimen name="ui_primary_font_size">@dimen/ui_DIMEN_26.0PX</dimen>
<dimen name="ui_second_font_size">@dimen/ui_DIMEN_24.0PX</dimen>
<dimen name="home_avigator_height">@dimen/ui_DIMEN_60.0PX</dimen>
<!-- BTN的高度 -->
<dimen name="home_btn_height">@dimen/ui_DIMEN_88.0PX</dimen>
</resources>
<resources>
<string name="app_name">学点云</string>
<!-- TODO: Remove or change this placeholder text -->
<string name="hello_blank_fragment">Hello blank fragment</string>
<string name="home_classid_hint">classid</string>
<string name="home_role_hint">userRole</string>
<string name="home_userid_hint">userid</string>
<string name="home_portal_hint">portal</string>
<string name="home_enter_class">进入课堂</string>
<string name="home_enter_replay">进入录制回放</string>
<string name="home_enter_login">登录</string>
<string name="home_enter_password">密码</string>
<string name="home_enter_username">用户名</string>
<string name="home_content_doc">文档</string>
<string name="home_content_chat">聊天</string>
<string name="home_dialog_pushAudio">推送音频</string>
<string name="home_dialog_pushVideo">推送视频</string>
<string name="home_dialog_selectList">选择列表</string>
<string name="home_msg_leave_character">退出</string>
<string name="home_msg_leave_class_whether">是否离开课堂</string>
<string name="home_msg_exit_class">退出课堂</string>
<string name="home_msg_leave_no"></string>
<string name="home_msg_leave_yes"></string>
<string name="home_msg_loading">加载中</string>
<string name="home_msg_join_class_success">加入课堂成功</string>
<string name="home_msg_error_net_disconnection">您设备的网络属于断开状态,请重新进入</string>
<string name="home_msg_verify">确认</string>
<string name="home_title_back">返回</string>
<string name="home_msg_play_audio_init">音频播放初始化</string>
<string name="home_msg_play_video_init">视频播放初始化</string>
<string name="imge_load_error">图片获取失败</string>
<!--登录-->
<string name="main_login_error_classId">课堂Id不能为空</string>
<string name="main_login_error_portal">服务器地址不能为空</string>
<string name="main_login_error_role">角色不能为空</string>
<string name="main_login_error_userId">用户id不能为空</string>
</resources>
... ... @@ -26,7 +26,7 @@ dependencies {
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
exclude group: 'com.android.support', module: 'support-annotations'
})
compile 'com.android.support:appcompat-v7:25.3.1'
testCompile 'junit:junit:4.12'
compile files('src/main/jniLibs/smartavengine.jar')
compile 'com.google.code.gson:gson:2.7'
... ...
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.mang.xdy">
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.mang.xuedianyun">
<application android:allowBackup="true" android:label="@string/app_name"
android:supportsRtl="true">
... ...
... ... @@ -198,7 +198,7 @@ public class XdySdk implements SubjectListener {
//如果是回放给出。m3u8的id用户 用户需要自己获取play_url_audio=audioPlayBean.getReplay();
}else{
//如果是host权限的在播放,下次在播放必须是host
if(isCurrentAudioHost){
if(isCurrentAudioHost||isCurrentVideoHost){
if(!Constants.HOST.equals(audioPlayBean.getUserRole())){
return;
}
... ... @@ -237,7 +237,7 @@ public class XdySdk implements SubjectListener {
// play_url_video=videoPlayBean.getReplay();
}else{
//如果是host权限的在播放,下次在播放必须是host
if(isCurrentVideoHost){
if(isCurrentVideoHost||isCurrentAudioHost){
if(!Constants.HOST.equals(videoPlayBean.getUserRole())){
return;
}
... ... @@ -308,6 +308,7 @@ public class XdySdk implements SubjectListener {
public static XdySdk getXdyInstance(){
if(mXdySdk ==null){
synchronized (XdySdk.class){
if(mXdySdk==null)
mXdySdk =new XdySdk();
}
}
... ... @@ -469,9 +470,15 @@ public class XdySdk implements SubjectListener {
if(videoPlayBean!=null) {
// if(videoPlayBean.getMediaId()!=videoPlayBean.getFromNodeId()) {
if(mNodeId !=videoPlayBean.getFromNodeId()) {
//过滤自己推送的video
//过滤自己推送的video,如果当前正在播放教师,如果不是host就不推送,1v1
if(isCurrentAudioHost||isCurrentVideoHost){
if(Constants.HOST.equals(videoPlayBean.getUserRole())){
handleListener(type, videoPlayBean.getMediaId() + "");
}
}else{
handleListener(type, videoPlayBean.getMediaId() + "");
}
aCache.put(videoPlayBean.getMediaId() + "", video);
handleListener(type, videoPlayBean.getMediaId() + "");
}
}else{
XdyLogUtil.e(TAG,"video play json error");
... ... @@ -483,8 +490,16 @@ public class XdySdk implements SubjectListener {
if(audioPlayBean!=null){
// if(audioPlayBean.getMediaId()!=audioPlayBean.getFromNodeId()) {
if(mNodeId !=audioPlayBean.getFromNodeId()) {
if(isCurrentAudioHost||isCurrentVideoHost){
if(Constants.HOST.equals(audioPlayBean.getUserRole())){
handleListener(type, audioPlayBean.getMediaId() + "");
}
}else{
handleListener(type, audioPlayBean.getMediaId() + "");
}
aCache.put(audioPlayBean.getMediaId() + "", audio);
handleListener(type, audioPlayBean.getMediaId() + "");
}
}
break;
... ...
... ... @@ -17,7 +17,7 @@ public class PlayerUtils {
* 这个地址的接收目前在同步的接口,后期做异步处理
* */
public static void getPublishPathVideo() {
String tem = "{ \"type\": \"live\"}";
String tem = "{ \"type\": \"flash\"}";
String s = XdyStringUtils.stringToJson(tem, true);
XdySdk.getXdyInstance().api(Constants.GET_VIDEO_PUBLISH_PATH, s);
}
... ... @@ -26,7 +26,7 @@ public class PlayerUtils {
* 获取音频推流地址
*/
public static void getPublishPathAudio() {
String tem = "{ \"type\": \"live\"}";
String tem = "{ \"type\": \"flash\"}";
String s = XdyStringUtils.stringToJson(tem, true);
XdySdk.getXdyInstance().api(Constants.GET_AUDIO_PUBLISH_PATH, s);
}
... ...
... ... @@ -15,23 +15,11 @@
<uses-feature android:name="android.hardware.camera.autofocus" />
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
... ... @@ -54,6 +42,7 @@
<activity android:name="com.mang.xuedianyun.android.activity.VideoPlayActivity"
android:configChanges="keyboardHidden|orientation|screenSize"
android:screenOrientation="portrait"
android:windowSoftInputMode="adjustResize|stateHidden"
>
</activity>
</application>
... ...
... ... @@ -8,16 +8,17 @@ import android.content.DialogInterface;
import android.content.pm.ActivityInfo;
import android.content.pm.PackageManager;
import android.content.res.Configuration;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.annotation.NonNull;
import android.support.design.widget.TabLayout;
import android.support.v4.app.ActivityCompat;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.support.v4.content.ContextCompat;
import android.support.v4.content.PermissionChecker;
import android.support.v7.app.AlertDialog;
import android.text.TextUtils;
import android.util.DisplayMetrics;
... ... @@ -26,7 +27,9 @@ import android.view.KeyEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.view.inputmethod.InputMethodManager;
import android.widget.FrameLayout;
import android.widget.ImageButton;
import android.widget.ImageView;
... ... @@ -54,6 +57,8 @@ import com.mang.xuedianyun.android.bean.TimeEntity;
import com.mang.xuedianyun.android.bean.VideoOrAudioStopEntity;
import com.mang.xuedianyun.android.fragment.ChatFragment;
import com.mang.xuedianyun.android.fragment.DocFragment;
import com.mang.xuedianyun.android.permission.PermissionFail;
import com.mang.xuedianyun.android.permission.PermissionSuccess;
import com.mang.xuedianyun.android.utils.JsonUtil;
import com.mang.xuedianyun.android.utils.ToastUtil;
import com.mang.xuedianyun.android.widget.dialog.LoginDialog;
... ... @@ -74,14 +79,12 @@ import org.greenrobot.eventbus.ThreadMode;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Locale;
import butterknife.BindView;
import butterknife.ButterKnife;
import zhangphil.iosdialog.widget.ActionSheetDialog;
import com.mang.xuedianyun.android.widget.dialog.AnswerSheetDialog;
import static com.pili.pldroid.player.AVOptions.KEY_DELAY_OPTIMIZATION;
... ... @@ -141,8 +144,8 @@ public class VideoPlayActivity extends FragmentActivity implements ObserverListe
SurfaceHolder sh;
/*课堂名字*/
private String className;
/*课堂类型*/
private int classType = 2;
/*课堂类型 2,直播课堂,后续还会有更多课堂*/
private int classType = 1;
private String[] titles;
... ... @@ -151,6 +154,7 @@ public class VideoPlayActivity extends FragmentActivity implements ObserverListe
private LinearLayout llVideo_table_chat;
private final int CAMERA_REQUEST_CODE = 1;
private final int AUDIO_REQUEST_CODE=2;
// private Fragment mFragment_Tablet_Chat;
private Handler mmHandler = new Handler() {
... ... @@ -202,6 +206,7 @@ public class VideoPlayActivity extends FragmentActivity implements ObserverListe
fra_videoPlay_start.setVisibility(View.VISIBLE);
}
}
setTabletType();
break;
case Constants.VIDEO_PLAY:
//播放视频
... ... @@ -224,7 +229,11 @@ public class VideoPlayActivity extends FragmentActivity implements ObserverListe
break;
case Constants.PLAY_SUCCESS:
//自定义消息 播放视频音频都通过这个来判断
img_playVideo_novideo.setVisibility(View.GONE);
if(isTablet(VideoPlayActivity.this)){
setTabletTeacherCover(false,false);
}else {
img_playVideo_novideo.setVisibility(View.GONE);
}
break;
case Constants.CLASS_UPDATE_TIMER:
if (replay && !mDragging)
... ... @@ -270,7 +279,7 @@ public class VideoPlayActivity extends FragmentActivity implements ObserverListe
// setAnswerLayout();
}
public void init() {
public void init() {
ArrayList<String> arrayList = getIntent().getStringArrayListExtra("init");
if (arrayList != null && arrayList.size() > 1) {
initClass = arrayList.get(0);
... ... @@ -358,22 +367,22 @@ public class VideoPlayActivity extends FragmentActivity implements ObserverListe
publishAudio();
}
})
.addSheetItem("单选或者多选", ActionSheetDialog.SheetItemColor.Blue
, new ActionSheetDialog.OnSheetItemClickListener() {
@Override
public void onClick(int which) {
//填写事件
// mAnswerSheetView.selectAnswerSheetType(AnswerSheetView.ANSWER_TYPE_SINGLE_OR_MORE);
// mAnswerSheetView.startCountTimerAndResizeLayout(22);
// setAnswerSheetLayout_Nornal(53);
AnswerSheetDialog answerSheetDialog= new AnswerSheetDialog(VideoPlayActivity.this);
answerSheetDialog.builder().show();
answerSheetDialog.selectAnswerSheetType(1);
answerSheetDialog.startCountTimerAndResizeLayout(30,50);
}
})
// .addSheetItem("单选或者多选", ActionSheetDialog.SheetItemColor.Blue
// , new ActionSheetDialog.OnSheetItemClickListener() {
// @Override
// public void onClick(int which) {
// //填写事件
//// mAnswerSheetView.selectAnswerSheetType(AnswerSheetView.ANSWER_TYPE_SINGLE_OR_MORE);
//// mAnswerSheetView.startCountTimerAndResizeLayout(22);
//// setAnswerSheetLayout_Nornal(53);
//
// AnswerSheetDialog answerSheetDialog= new AnswerSheetDialog(VideoPlayActivity.this);
// answerSheetDialog.builder().show();
// answerSheetDialog.selectAnswerSheetType(1);
// answerSheetDialog.startCountTimerAndResizeLayout(30,50);
//
// }
// })
// .addSheetItem("对错选择", ActionSheetDialog.SheetItemColor.Blue
// , new ActionSheetDialog.OnSheetItemClickListener() {
// @Override
... ... @@ -504,7 +513,7 @@ public class VideoPlayActivity extends FragmentActivity implements ObserverListe
playRecord(response,false);
} else {
// if (!checkPermission()) {
// if (!checkPermissionVideo()) {
// return;
// }
... ... @@ -543,8 +552,13 @@ public class VideoPlayActivity extends FragmentActivity implements ObserverListe
// }
xdySdk.api("playVideo", response + "", surfaceviewPlayVideo, VideoPlayActivity.this);
// img_playVideo_novideo.setVisibility(View.GONE);
img_playVideo_novideo.setImageResource(R.mipmap.no_video);
ToastUtil.showToastshort(getResources().getString(R.string.home_msg_play_video_init), VideoPlayActivity.this);
if(isTablet(this)) {
setTabletTeacherCover(true,false);
}else {
img_playVideo_novideo.setImageResource(R.mipmap.no_video);
}
//// TODO: 2017/5/18 tihsi
// ToastUtil.showToastshort(getResources().getString(R.string.home_msg_play_video_init), VideoPlayActivity.this);
}
}
... ... @@ -562,9 +576,15 @@ public class VideoPlayActivity extends FragmentActivity implements ObserverListe
} else {
xdySdk.api("playAudio", response, null, VideoPlayActivity.this);
img_playVideo_novideo.setImageResource(R.mipmap.audio_mode);
img_playVideo_novideo.setVisibility(View.VISIBLE);
ToastUtil.showToastshort(getResources().getString(R.string.home_msg_play_audio_init), VideoPlayActivity.this);
if(isTablet(this)){
setTabletTeacherCover(true,true);
}else{
img_playVideo_novideo.setImageResource(R.mipmap.audio_mode);
img_playVideo_novideo.setVisibility(View.VISIBLE);
}
//// TODO: 2017/5/18 提示
// ToastUtil.showToastshort(getResources().getString(R.string.home_msg_play_audio_init), VideoPlayActivity.this);
}
}
/*教师端主动开始视频,或关闭视频*/
... ... @@ -615,7 +635,15 @@ public class VideoPlayActivity extends FragmentActivity implements ObserverListe
//如果收到class_exit 就执行,退出界面
UIUtils.closeDialog(mLoginDialog);
exit();
xdySdk.api("leaveClass", "");
mHandler.postDelayed(new Runnable() {
@Override
public void run() {
exit();
}
},100);
}
})
.create();
... ... @@ -658,6 +686,11 @@ public class VideoPlayActivity extends FragmentActivity implements ObserverListe
case "301":
progressDialogDismiss();
break;
case "910":
progressDialogDismiss();
exit();
ToastUtil.showToastshort(errorEntity.getReson(), this);
break;
case "911":
progressDialogDismiss();
exit();
... ... @@ -730,8 +763,8 @@ public class VideoPlayActivity extends FragmentActivity implements ObserverListe
public void exit() {
progressDialogDismiss();
isDefaultExit = true;
xdySdk.api("stopPublishVideo", "");
xdySdk.api("leaveClass", "");
// xdySdk.api("stopPublishVideo", "");
// xdySdk.api("leaveClass", "");
xdySdk.remove(this);
mLoginDialog=null;
xdySdk.onPublisherStop();
... ... @@ -794,8 +827,12 @@ public class VideoPlayActivity extends FragmentActivity implements ObserverListe
VideoOrAudioStopEntity entity = JsonUtil.parseJsonToBean(response, VideoOrAudioStopEntity.class);
if (entity != null) {
if (xdySdk.onPlayStop(entity.getMediaId() + "")) {
img_playVideo_novideo.setImageResource(R.mipmap.no_video);
img_playVideo_novideo.setVisibility(View.VISIBLE);
if(isTablet(this)){
setTabletTeacherCover(true,false);
}else {
img_playVideo_novideo.setImageResource(R.mipmap.no_video);
img_playVideo_novideo.setVisibility(View.VISIBLE);
}
}
}
}
... ... @@ -833,72 +870,8 @@ public class VideoPlayActivity extends FragmentActivity implements ObserverListe
private boolean isCameraCheckFirst = true;
private boolean isAudioCheckFirst = true;
private boolean checkPermission() {
// try {
// int pRecordAudio = PermissionChecker.checkCallingOrSelfPermission(this, "android.permission.RECORD_AUDIO");
// int pCamera = PermissionChecker.checkCallingOrSelfPermission(this, "android.permission.CAMERA");
// if(pRecordAudio != PackageManager.PERMISSION_GRANTED) {
// Log.e(TAG,"do not have AudioRecord permission, please check");
// Toast.makeText(this,"do not have AudioRecord permission, please check", Toast.LENGTH_LONG).show();
// if(isCameraCheckFirst){
// //settingPermission();
// isCameraCheckFirst=false;
// }
// ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA},
// 1);
// return false;
// }
// if(pCamera != PackageManager.PERMISSION_GRANTED) {
// Log.e(TAG,"do not have CAMERA permission, please check");
// Toast.makeText(this,"do not have CAMERA permission, please check", Toast.LENGTH_LONG).show();
// if(isAudioCheckFirst){
// //settingPermission();
// isAudioCheckFirst=false;
// }
// return false;
//
// }
// } catch (Exception e) {
// e.printStackTrace();
// }
// try {
// if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA)
// != PackageManager.PERMISSION_GRANTED) {
// // 第一次请求权限时,用户如果拒绝,下一次请求shouldShowRequestPermissionRationale()返回true
// // 向用户解释为什么需要这个权限
// if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.CAMERA)) {
//
// } else {
// //申请相机权限
// ActivityCompat.requestPermissions(this,
// new String[]{Manifest.permission.CAMERA}, CAMERA_REQUEST_CODE);
// }
// }
// }catch ( Exception e){
//
// }
return true;
}
private void requestPermission() {
if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA)
!= PackageManager.PERMISSION_GRANTED) {
// 第一次请求权限时,用户如果拒绝,下一次请求shouldShowRequestPermissionRationale()返回true
// 向用户解释为什么需要这个权限
if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.CAMERA)) {
} else {
//申请相机权限
ActivityCompat.requestPermissions(this,
new String[]{Manifest.permission.CAMERA}, CAMERA_REQUEST_CODE);
}
} else {
// tvPermissionStatus.setTextColor(Color.GREEN);
// tvPermissionStatus.setText("相机权限已申请");
}
}
@Override
public void observerUpData(String type, String parameter) {
... ... @@ -919,6 +892,10 @@ public class VideoPlayActivity extends FragmentActivity implements ObserverListe
private boolean pause = true;
/**
* 回放消失时间
*/
int TIME_OUT = 3600;
/**
* 退出标记
*/
private boolean quit;
... ... @@ -1094,8 +1071,6 @@ public class VideoPlayActivity extends FragmentActivity implements ObserverListe
}
};
int TIME_OUT = 3600;
/**
* @param timeout 单位秒
*/
... ... @@ -1113,9 +1088,12 @@ public class VideoPlayActivity extends FragmentActivity implements ObserverListe
mHandler.sendEmptyMessage(SHOW_PROGRESS);
mMediaContainer.setVisibility(View.VISIBLE);
if (timeout != 0) {
mHandler.removeMessages(FADE_OUT);
mHandler.sendMessageDelayed(mHandler.obtainMessage(FADE_OUT),
timeout);
//平板回放不让进度条消失
if(!isTablet(this)) {
mHandler.removeMessages(FADE_OUT);
mHandler.sendMessageDelayed(mHandler.obtainMessage(FADE_OUT),
timeout);
}
}
}
... ... @@ -1286,12 +1264,19 @@ public class VideoPlayActivity extends FragmentActivity implements ObserverListe
VideoPlayBean videoPlayBean = JsonUtil.parseJsonToBean(json_video, VideoPlayBean.class);
if (videoPlayBean != null) {
//回放不会出现Constants.PLAY_SUCCESS:
if(Constants.HOST.equals(videoPlayBean.getUserRole())) {
if (img_playVideo_novideo != null)
img_playVideo_novideo.setVisibility(View.GONE);
if(isAudio){
img_playVideo_novideo.setImageResource(R.mipmap.audio_mode);
img_playVideo_novideo.setVisibility(View.VISIBLE);
if(classType==2||Constants.HOST.equals(videoPlayBean.getUserRole())) {
if(isTablet(this)){
setTabletTeacherCover(false,false);
if (isAudio) {
setTabletTeacherCover(true,true);
}
}else {
if (img_playVideo_novideo != null)
img_playVideo_novideo.setVisibility(View.GONE);
if (isAudio) {
img_playVideo_novideo.setImageResource(R.mipmap.audio_mode);
img_playVideo_novideo.setVisibility(View.VISIBLE);
}
}
if (mVideoView.isPlaying()) {
mVideoView.stopPlayback();
... ... @@ -1302,11 +1287,12 @@ public class VideoPlayActivity extends FragmentActivity implements ObserverListe
mVideoView.seekTo(videoPlayBean.getSeek() * 1000);
}
mVideoView.start();
}else{
}else if(classType==1&&!Constants.HOST.equals(videoPlayBean.getUserRole())){
//推流 回放
// if (img_playVideo_novideo != null) {
// img_playVideo_novideo.setVisibility(View.GONE);
// }
coverStudent(false);
if (mPushVideoView != null) {
mPushVideoView.setVisibility(View.VISIBLE);
}
... ... @@ -1316,7 +1302,8 @@ public class VideoPlayActivity extends FragmentActivity implements ObserverListe
if (mPushVideoView.isPlaying()) {
mPushVideoView.stopPlayback();
}
mPushVideoView.setVideoPath("http://123.56.73.119:6001/live/h5dev_1992614331_980_983042_1494927366/total.m3u8");
// mPushVideoView.setVideoPath("http://123.56.73.119:6001/live/h5dev_1992614331_980_983042_1494927366/total.m3u8");
mPushVideoView.setVideoPath(videoPlayBean.getReplay());
if (replay && videoPlayBean.getSeek() > 0) {
mPushVideoView.seekTo(videoPlayBean.getSeek() * 1000);
... ... @@ -1330,13 +1317,18 @@ public class VideoPlayActivity extends FragmentActivity implements ObserverListe
mHandler.post(new Runnable() {
@Override
public void run() {
img_playVideo_novideo.setImageResource(R.mipmap.no_video);
img_playVideo_novideo.setVisibility(View.VISIBLE);
if(isTablet(VideoPlayActivity.this)){
setTabletTeacherCover(true,false);
}else {
img_playVideo_novideo.setImageResource(R.mipmap.no_video);
img_playVideo_novideo.setVisibility(View.VISIBLE);
}
}
});
//隐藏直播回放
mPushVideoView.setVisibility(View.GONE);
//显示学生标志
coverStudent(true);
if (isPlayVideoMode && mVideoView != null && mVideoView.isPlaying()) {
mVideoView.stopPlayback();
}
... ... @@ -1347,18 +1339,25 @@ public class VideoPlayActivity extends FragmentActivity implements ObserverListe
}
public void stopAudio() {
img_playVideo_novideo.setImageResource(R.mipmap.no_video);
img_playVideo_novideo.setVisibility(View.VISIBLE);
if(isTablet(this)){
setTabletTeacherCover(true,false);
}else{
img_playVideo_novideo.setImageResource(R.mipmap.no_video);
img_playVideo_novideo.setVisibility(View.VISIBLE);
}
//隐藏直播回放
mPushVideoView.setVisibility(View.GONE);
mIamgeView_PublishAudio.setVisibility(View.GONE);
if (isPlayVideoMode && mVideoView != null && mVideoView.isPlaying()) {
//显示学生标志
coverStudent(true);
if (!isPlayVideoMode && mVideoView != null && mVideoView.isPlaying()) {
mVideoView.stopPlayback();
}
if (isPlayVideoMode && mPushVideoView != null && mPushVideoView.isPlaying()) {
if (!isPlayVideoMode && mPushVideoView != null && mPushVideoView.isPlaying()) {
mPushVideoView.stopPlayback();
}
... ... @@ -1398,17 +1397,27 @@ public class VideoPlayActivity extends FragmentActivity implements ObserverListe
}
/********************************平板*********************************************************/
/******************************* *********************平板*********************************************************/
private LinearLayout llvideoPlayright;
private FrameLayout fra_videoPlay_student_cover;
/*打开音频*/
private FrameLayout fra_videoPlay_start_audio;
/*推流*/
/*显示文档*/
private LinearLayout ll_videoPlay_tablet_doc;
/*tablet 老师视频播放遮盖*/
private FrameLayout fra_playVideo_novideo_tablet;
/*tablet 老师视频播放遮盖图片*/
private ImageView img_playVideo_novideo_tablet;
/*教师播放窗口*/
private RelativeLayout rel_videoPlay_play;
/*推流端窗口*/
private RelativeLayout rel_videoPlay_publish;
public void initTablet(){
if(!isTablet(this)){
return;
}
XdyLogUtil.e("classType: ","课堂类型:"+classType);
//如果是横排,则改为竖排
if(getRequestedOrientation() == ActivityInfo.SCREEN_ORIENTATION_PORTRAIT)
{
... ... @@ -1421,16 +1430,17 @@ public class VideoPlayActivity extends FragmentActivity implements ObserverListe
int offset=30;//默认偏移
double ratio_tablet=(winWidth*1.0)/winHeight;
double ratio_width=4;
llVideo_table_chat= (LinearLayout) findViewById(R.id.ll_videoPlay_tablet_chat);
llvideoPlayright= (LinearLayout) findViewById(R.id.ll_videoPlay_right);
fra_videoPlay_student_cover= (FrameLayout) findViewById(R.id.fra_videoPlay_student_cover);
fra_videoPlay_start_audio= (FrameLayout) findViewById(R.id.fra_videoPlay_start_audio);
rel_videoPlay_publish= (RelativeLayout) findViewById(R.id.rel_videoPlay_publish);
if(replay){
rel_videoPlay_publish.setVisibility(View.GONE);
}else {
rel_videoPlay_publish.setVisibility(View.VISIBLE);
}
ll_videoPlay_tablet_doc= (LinearLayout) findViewById(R.id.ll_videoPlay_tablet_doc);
fra_playVideo_novideo_tablet= (FrameLayout) findViewById(R.id.fra_playVideo_novideo_tablet);
img_playVideo_novideo_tablet= (ImageView) findViewById(R.id.img_playVideo_novideo_tablet);
rel_videoPlay_play= (RelativeLayout) findViewById(R.id.rel_videoPlay_play);
rel_videoPlay_publish= (RelativeLayout) findViewById(R.id.rel_videoPlay_publish);
if(ratio_tablet>1.4){
//偏移尽量小,或者偏移不
offset=30;
... ... @@ -1439,13 +1449,27 @@ public class VideoPlayActivity extends FragmentActivity implements ObserverListe
offset=75;
ratio_width=4;
}
XdyLogUtil.e("学点云Tablet:",""+winWidth/4+"::"+(5*winWidth)/(16)+":"+winWidth+"offset:"+offset+"ratio_width:"+ratio_width);
XdyLogUtil.e("学点云Tablet:",winWidth/(ratio_width*(4/5))+":"+(int)((winWidth/ratio_width)*(4/5))+""+winWidth/4+"::"+(5*winWidth)/(16)+":"+winWidth+"offset:"+offset+"ratio_width:"+ratio_width);
RelativeLayout.LayoutParams layoutParams_right=new RelativeLayout.LayoutParams((int) (winWidth/ratio_width), RelativeLayout.LayoutParams.MATCH_PARENT);
layoutParams_right.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);
layoutParams_right.setMargins(0,0,XdyStringUtils.dp2px(this,5),0);
llvideoPlayright.setLayoutParams(layoutParams_right);
LinearLayout.LayoutParams layoutParams=new LinearLayout.LayoutParams((int)(winWidth/ratio_width),(int)(winWidth/ratio_width+offset));
//教师播放界面设置
LinearLayout.LayoutParams layoutParams_teacher=new LinearLayout.LayoutParams((int) (winWidth/ratio_width), (int)(winWidth/(ratio_width+1.1)));
// layoutParams_teacher.setMargins(0,XdyStringUtils.dp2px(this,8),0,0);
rel_videoPlay_play.setLayoutParams(layoutParams_teacher);
if(classType==1) {
//学生推流播放界面设置
LinearLayout.LayoutParams layoutParams_student = new LinearLayout.LayoutParams((int) (winWidth / ratio_width), (int) (winWidth / (ratio_width + 1.1)));
layoutParams_student.setMargins(0, XdyStringUtils.dp2px(this, 8), 0, 0);
rel_videoPlay_publish.setLayoutParams(layoutParams_student);
}else{
rel_videoPlay_publish.setVisibility(View.GONE);
}
LinearLayout.LayoutParams layoutParams=new LinearLayout.LayoutParams((int)(winWidth/ratio_width), ViewGroup.LayoutParams.MATCH_PARENT);
layoutParams.setMargins(0,XdyStringUtils.dp2px(this,8),0,0);
llVideo_table_chat.setLayoutParams(layoutParams);
... ... @@ -1453,8 +1477,47 @@ public class VideoPlayActivity extends FragmentActivity implements ObserverListe
FragmentTransaction transaction = fm.beginTransaction();
transaction.add(R.id.ll_videoPlay_tablet_chat,ChatFragment.newInstance(replay),"tag");
transaction.commit();
hideKeyboard();
setTabletTeacherCover(true,false);
setListenerPublishAudio();
}
/*Tablet 设置类型*/
public void setTabletType(){
if(!isTablet(this)){
return;
}
if(replay){
//直播课堂隐藏这个推流界面, 1v1 回放隐藏推流按钮
tabletShowAudio(false);
if(classType==2) {
rel_videoPlay_publish.setVisibility(View.GONE);
}else if(classType==1){
rel_videoPlay_publish.setVisibility(View.VISIBLE);
fra_videoPlay_start.setVisibility(View.GONE);
}
}else {
if(classType==2) {
rel_videoPlay_publish.setVisibility(View.GONE);
}else if(classType==1) {
rel_videoPlay_publish.setVisibility(View.VISIBLE);
}
}
}
public void setTabletTeacherCover(boolean isShow,boolean iaAudio){
if(isShow){
//显示对
img_playVideo_novideo.setVisibility(View.GONE);
fra_playVideo_novideo_tablet.setVisibility(View.VISIBLE);
if(iaAudio){
img_playVideo_novideo_tablet.setImageResource(R.mipmap.audio_icon_tablet);
}else{
img_playVideo_novideo_tablet.setImageResource(R.mipmap.video_teacher_icon);
}
}else{
fra_playVideo_novideo_tablet.setVisibility(View.GONE);
}
}
/*打开音频*/
public void setListenerPublishAudio(){
fra_videoPlay_start_audio.setOnClickListener(new View.OnClickListener() {
... ... @@ -1470,9 +1533,9 @@ public class VideoPlayActivity extends FragmentActivity implements ObserverListe
return;
}
if(show){
fra_videoPlay_start_audio.setVisibility(View.GONE);
}else{
fra_videoPlay_start_audio.setVisibility(View.VISIBLE);
}else{
fra_videoPlay_start_audio.setVisibility(View.GONE);
}
}
... ... @@ -1483,9 +1546,9 @@ public class VideoPlayActivity extends FragmentActivity implements ObserverListe
return;
}
if(show) {
fra_videoPlay_student_cover.setVisibility(View.GONE);
}else{
fra_videoPlay_student_cover.setVisibility(View.VISIBLE);
}else{
fra_videoPlay_student_cover.setVisibility(View.GONE);
}
}
/**
... ... @@ -1498,15 +1561,23 @@ public class VideoPlayActivity extends FragmentActivity implements ObserverListe
}
/******************************************************公共**********************************/
/*推送视频*/
public void publishVideo(){
//填写事件
if (!checkPermission()) {
return;
isPublsishVideoMode = true;
if(!isPushVideoPermission) {
if (!checkPermissionVideo()) {
return;
}
}
coverStudent(true);
tabletShowAudio(true);
if(!isPushAudioPermission){
if(!checkAudioPermission()){
return;
}
}
coverStudent(false);
tabletShowAudio(false);
mFramenLayout_stopPublish.setVisibility(View.VISIBLE);
fra_videoPlay_start.setVisibility(View.GONE);
surfaceView_publish.setVisibility(View.VISIBLE);
... ... @@ -1516,15 +1587,23 @@ public class VideoPlayActivity extends FragmentActivity implements ObserverListe
sh.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
surfaceView_publish.setZOrderMediaOverlay(true);
xdySdk.api("publishVideo", "", surfaceView_publish, VideoPlayActivity.this);
isPublsishVideoMode = true;
isPushVideoPermission=false;
isPushAudioPermission=false;
}
public boolean isPushVideoPermission =false;
private boolean isPushAudioPermission=false;
/*推送音频*/
public void publishAudio(){
if (!checkPermission()) {
return;
isPublsishVideoMode = false;
if(!isPushAudioPermission){
if(!checkAudioPermission()){
return;
}
}
coverStudent(true);
tabletShowAudio(true);
coverStudent(false);
tabletShowAudio(false);
mFramenLayout_stopPublish.setVisibility(View.VISIBLE);
fra_videoPlay_start.setVisibility(View.GONE);
surfaceView_publish.setVisibility(View.GONE);
... ... @@ -1532,7 +1611,8 @@ public class VideoPlayActivity extends FragmentActivity implements ObserverListe
fra_videoPlay_start.setEnabled(false);
mFramenLayout_stopPublish.setEnabled(true);
xdySdk.api(Constants.PUBLISH_AUDIO, "", null, VideoPlayActivity.this);
isPublsishVideoMode = false;
isPushAudioPermission=false;
}
/*停止推流*/
public void stopPublish(){
... ... @@ -1541,13 +1621,116 @@ public class VideoPlayActivity extends FragmentActivity implements ObserverListe
} else {
xdySdk.api("stopPublishAudio", "");
}
coverStudent(false);
coverStudent(true);
fra_videoPlay_start.setEnabled(true);
mFramenLayout_stopPublish.setEnabled(false);
mFramenLayout_stopPublish.setVisibility(View.GONE);
fra_videoPlay_start.setVisibility(View.VISIBLE);
surfaceView_publish.setVisibility(View.GONE);
mIamgeView_PublishAudio.setVisibility(View.GONE);
tabletShowAudio(false);
tabletShowAudio(true);
}
/**
* 隐藏软键盘
*/
public void hideKeyboard() {
InputMethodManager imm = (InputMethodManager) this
.getSystemService(Context.INPUT_METHOD_SERVICE);
if (imm.isActive() && this.getCurrentFocus() != null) {
imm.hideSoftInputFromWindow(this.getCurrentFocus()
.getWindowToken(), 0);
}
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
// getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);//不自动弹出软键盘
}
@PermissionSuccess(requestCode = PER_CAMERA)
private void grantPermissionSuccess(){
Toast.makeText(this,"已获照相机得权限",Toast.LENGTH_SHORT).show();
}
private final int PER_CAMERA = 3;
@PermissionFail(requestCode = PER_CAMERA)
private void grantPersmissionFail(){
Toast.makeText(this,"照相机权限被拒绝",Toast.LENGTH_SHORT).show();
}
/*获取Video*/
private boolean checkPermissionVideo() {
boolean isCreame=true;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA)
!= PackageManager.PERMISSION_GRANTED) {
// 第一次请求权限时,用户如果拒绝,下一次请求shouldShowRequestPermissionRationale()返回true
// 向用户解释为什么需要这个权限
if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.CAMERA)) {
isCreame=false;
ToastUtil.showToastshort(getResources().getString(R.string.request_permission_video), VideoPlayActivity.this);
} else {
//申请相机权限
isCreame=false;
ActivityCompat.requestPermissions(this,
new String[]{Manifest.permission.CAMERA}, CAMERA_REQUEST_CODE);
}
}
}
return isCreame;
}
/*检查音频权限*/
private boolean checkAudioPermission() {
boolean isCreame=true;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (ContextCompat.checkSelfPermission(this, Manifest.permission.RECORD_AUDIO)
!= PackageManager.PERMISSION_GRANTED) {
// 第一次请求权限时,用户如果拒绝,下一次请求shouldShowRequestPermissionRationale()返回true
// 向用户解释为什么需要这个权限
if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.RECORD_AUDIO)) {
isCreame=false;
ToastUtil.showToastshort(getResources().getString(R.string.rquest_permission_audio), VideoPlayActivity.this);
} else {
//申请相机权限
isCreame=false;
ActivityCompat.requestPermissions(this,
new String[]{Manifest.permission.RECORD_AUDIO}, AUDIO_REQUEST_CODE);
}
}
}
return isCreame;
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
switch (requestCode){
case CAMERA_REQUEST_CODE:
if(grantResults[0] == PackageManager.PERMISSION_GRANTED){
//去播流
isPushVideoPermission =true;
publishVideo();
}else{
//啥也不做
ToastUtil.showToastshort(getResources().getString(R.string.request_permission_video),this);
}
break;
case AUDIO_REQUEST_CODE:
if(grantResults[0] == PackageManager.PERMISSION_GRANTED){
//去播流
isPushAudioPermission=true;
if(isPublsishVideoMode) {
publishVideo();
}else{
publishAudio();
}
}else{
//啥也不做
ToastUtil.showToastshort(getResources().getString(R.string.rquest_permission_audio),this);
}
break;
}
}
}
... ...
package com.mang.xuedianyun.android.permission;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* 标识权限获取失败
*/
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface PermissionFail {
int requestCode();
}
... ...
package com.mang.xuedianyun.android.permission;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* 标识权限获取成功
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface PermissionSuccess {
int requestCode();
}
\ No newline at end of file
... ...
package com.mang.xuedianyun.android.permission;
import android.app.Activity;
import android.content.Context;
import android.content.pm.PackageManager;
import android.os.Build;
import android.support.annotation.NonNull;
import android.support.v4.app.ActivityCompat;
import android.support.v4.app.Fragment;
import android.support.v4.content.ContextCompat;
import java.lang.reflect.Method;
/**
* 权限工具类
*/
public class PermissionUtil {
public static void needPermission(Fragment context, int reqCode, String... permissions) {
needPermission(context.getActivity(), reqCode, permissions);
}
public static void needPermission(Activity context, int reqCode, String... permissions) {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
//6.0以下版本不需要代码申请权限
executeSuccessResult(context, reqCode);
}
boolean granted = hasPermission(context, permissions);//检查权限
if (granted) {
//已获得权限
executeSuccessResult(context, reqCode);
} else {
//申请权限
ActivityCompat.requestPermissions(context, permissions, reqCode);
}
}
private static void executeSuccessResult(Object context, int reqCode) {
Method successMethod = getTargetMethod(context, reqCode,PermissionSuccess.class);
try {
successMethod.invoke(context);
} catch (Exception e) {
e.printStackTrace();
}
}
private static void executeFailResult(Object context, int reqCode) {
Method successMethod = getTargetMethod(context, reqCode,PermissionFail.class);
try {
successMethod.invoke(context);
} catch (Exception e) {
e.printStackTrace();
}
}
private static Method getTargetMethod(Object context, int reqCode, Class annotation) {
Method[] declaredMethods = context.getClass().getDeclaredMethods();
for (Method method : declaredMethods) {
if (!method.isAccessible()) {
method.setAccessible(true); //私有的方法必须强制
}
//判断方法上是否使用了目标注解
boolean annotationPresent = method.isAnnotationPresent(annotation);
if (annotationPresent) {
if (isTargetMethod(method,reqCode,annotation)) { //比较requestCode是否相等
return method;
}
}
}
return null;
}
private static boolean isTargetMethod(Method method, int reqCode, Class cls){
if(cls.equals(PermissionSuccess.class)){
return reqCode == method.getAnnotation(PermissionSuccess.class).requestCode();
}else if(cls.equals(PermissionFail.class)){
return reqCode == method.getAnnotation(PermissionFail.class).requestCode();
}
return false;
}
private static boolean hasPermission(Context context, String... permissions) {
for (String permission : permissions) {
int granted = ContextCompat.checkSelfPermission(context, permission);
if (granted == PackageManager.PERMISSION_DENIED) {
return false;
}
}
return true;
}
public static void onRequestPermissionsResult(Fragment context, int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
onRequestPermissionsResult(context, requestCode, permissions, grantResults);
}
public static void onRequestPermissionsResult(Activity context, int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
boolean permissionGranted = true;
for (int grant : grantResults) {
if (grant == PackageManager.PERMISSION_DENIED) {
permissionGranted = false;
break;
}
}
if (permissionGranted) {
//获得权限
executeSuccessResult(context, requestCode);
} else {
//权限被用户拒绝
executeFailResult(context, requestCode);
}
}
}
... ...