Repository: yangguangfu520/MobilePlayer1020 Branch: master Commit: 336b8a53d83b Files: 817 Total size: 2.2 MB Directory structure: gitextract_qndc5fgf/ ├── .gitignore ├── AgoraDemo/ │ ├── .gitignore │ ├── build.gradle │ ├── libs/ │ │ ├── agora-rtc-sdk.jar │ │ ├── android-async-http-1.4.8.jar │ │ ├── crasheye.jar │ │ └── fastjson.jar │ ├── proguard-rules.pro │ └── src/ │ ├── androidTest/ │ │ └── java/ │ │ └── io/ │ │ └── agora/ │ │ └── demo/ │ │ └── agora/ │ │ └── ApplicationTest.java │ └── main/ │ ├── AndroidManifest.xml │ ├── java/ │ │ └── io/ │ │ └── agora/ │ │ └── demo/ │ │ └── agora/ │ │ ├── AgoraApplication.java │ │ ├── BaseActivity.java │ │ ├── BaseEngineEventHandlerActivity.java │ │ ├── ChannelActivity.java │ │ ├── EntryActivity.java │ │ ├── LoginActivity.java │ │ ├── MessageHandler.java │ │ └── util/ │ │ ├── LoggingUtils.java │ │ └── NetworkConnectivityUtils.java │ └── res/ │ ├── drawable-xhdpi/ │ │ ├── button_selector_hung_up.xml │ │ ├── go_micro_button_background.xml │ │ ├── go_video_button_background.xml │ │ ├── room_leave_button_background.xml │ │ ├── shape_theme.xml │ │ └── shape_transparent.xml │ ├── layout/ │ │ ├── actionbar.xml │ │ ├── activity_entry.xml │ │ ├── activity_login.xml │ │ ├── activity_room.xml │ │ └── viewlet_remote_user.xml │ ├── menu/ │ │ └── menu_main.xml │ ├── values/ │ │ ├── color.xml │ │ ├── strings.xml │ │ └── styles.xml │ └── values-zh/ │ └── strings.xml ├── Android-MaterialRefreshLayout-master/ │ ├── .gitignore │ ├── build.gradle │ └── src/ │ └── main/ │ ├── AndroidManifest.xml │ ├── java/ │ │ └── com/ │ │ └── cjj/ │ │ └── android_materialrefreshlayout/ │ │ ├── AutoRefreshActivity.java │ │ ├── BaseActivity.java │ │ ├── LoadMoreActivity.java │ │ ├── OverLayActivity.java │ │ ├── ScrollViewActivity.java │ │ ├── SimpleActivity.java │ │ ├── SunActivity.java │ │ ├── SwipeRefreshLayoutActivity.java │ │ └── WaveActivity.java │ └── res/ │ ├── layout/ │ │ ├── activity_base.xml │ │ ├── activity_listview.xml │ │ ├── activity_main.xml │ │ ├── activity_scrollview.xml │ │ ├── activity_simple.xml │ │ ├── fragment_list.xml │ │ ├── list_item.xml │ │ └── toolbar_layout.xml │ ├── menu/ │ │ └── menu_main.xml │ ├── values/ │ │ ├── colors.xml │ │ ├── dimens.xml │ │ ├── strings.xml │ │ └── styles.xml │ ├── values-v19/ │ │ ├── dimens.xml │ │ └── styles.xml │ ├── values-v21/ │ │ └── styles.xml │ └── values-w820dp/ │ └── dimens.xml ├── Android应用源码音乐实时跳动频谱显示Demo/ │ ├── build.gradle │ └── src/ │ └── main/ │ ├── AndroidManifest.xml │ ├── java/ │ │ └── com/ │ │ └── terry/ │ │ └── AudioFx/ │ │ ├── AudioFxActivity.java │ │ └── BaseVisualizerView.java │ └── res/ │ ├── layout/ │ │ └── main.xml │ └── values/ │ └── strings.xml ├── EventBus/ │ ├── .gitignore │ ├── build.gradle │ └── src/ │ └── org/ │ └── greenrobot/ │ └── eventbus/ │ ├── AsyncPoster.java │ ├── BackgroundPoster.java │ ├── EventBus.java │ ├── EventBusBuilder.java │ ├── EventBusException.java │ ├── HandlerPoster.java │ ├── NoSubscriberEvent.java │ ├── PendingPost.java │ ├── PendingPostQueue.java │ ├── Subscribe.java │ ├── SubscriberExceptionEvent.java │ ├── SubscriberMethod.java │ ├── SubscriberMethodFinder.java │ ├── Subscription.java │ ├── ThreadMode.java │ ├── meta/ │ │ ├── AbstractSubscriberInfo.java │ │ ├── SimpleSubscriberInfo.java │ │ ├── SubscriberInfo.java │ │ ├── SubscriberInfoIndex.java │ │ └── SubscriberMethodInfo.java │ └── util/ │ ├── AsyncExecutor.java │ ├── ErrorDialogConfig.java │ ├── ErrorDialogFragmentFactory.java │ ├── ErrorDialogFragments.java │ ├── ErrorDialogManager.java │ ├── ExceptionToResourceMapping.java │ ├── HasExecutionScope.java │ └── ThrowableFailureEvent.java ├── EventBus3.0_Sample/ │ ├── .gitignore │ ├── build.gradle │ └── src/ │ └── main/ │ ├── AndroidManifest.xml │ ├── java/ │ │ └── com/ │ │ └── harvic/ │ │ ├── other/ │ │ │ ├── FirstEvent.java │ │ │ ├── SecondEvent.java │ │ │ └── ThirdEvent.java │ │ └── tryeventbus2/ │ │ ├── MainActivity.java │ │ └── SecondActivity.java │ └── res/ │ ├── layout/ │ │ ├── activity_main.xml │ │ └── activity_second.xml │ ├── menu/ │ │ ├── main.xml │ │ └── second.xml │ ├── values/ │ │ ├── dimens.xml │ │ ├── strings.xml │ │ └── styles.xml │ ├── values-v11/ │ │ └── styles.xml │ ├── values-v14/ │ │ └── styles.xml │ └── values-w820dp/ │ └── dimens.xml ├── JieCaoVideoPlayer-develop/ │ ├── .gitignore │ ├── build.gradle │ ├── proguard-rules.pro │ └── src/ │ ├── androidTest/ │ │ └── java/ │ │ └── fm/ │ │ └── jiecao/ │ │ └── jiecaovideoplayer/ │ │ └── ApplicationTest.java │ ├── main/ │ │ ├── AndroidManifest.xml │ │ ├── assets/ │ │ │ └── jcvd.html │ │ ├── java/ │ │ │ └── fm/ │ │ │ └── jiecao/ │ │ │ └── jiecaovideoplayer/ │ │ │ ├── AutoTinyActivity.java │ │ │ ├── AutoTinyListActivity.java │ │ │ ├── AutoTinyNormalActivity.java │ │ │ ├── CustomView/ │ │ │ │ ├── JCVideoPlayerStandardAutoComplete.java │ │ │ │ ├── JCVideoPlayerStandardFresco.java │ │ │ │ ├── JCVideoPlayerStandardShowShareButtonAfterFullscreen.java │ │ │ │ ├── JCVideoPlayerStandardShowTextureViewAfterAutoComplete.java │ │ │ │ └── JCVideoPlayerStandardShowTitleAfterFullscreen.java │ │ │ ├── DemoApplication.java │ │ │ ├── ListViewActivity.java │ │ │ ├── ListViewMultiHolderActivity.java │ │ │ ├── ListViewNormalActivity.java │ │ │ ├── ListViewViewpagerActivity.java │ │ │ ├── MainActivity.java │ │ │ ├── PlayDirectlyActivity.java │ │ │ ├── RecyclerViewNormalActivity.java │ │ │ ├── RecyclerViewVideoAdapter.java │ │ │ ├── UIActivity.java │ │ │ ├── UIBigChangeActivity.java │ │ │ ├── UIImageLoaderActivity.java │ │ │ ├── UISmallChangeActivity.java │ │ │ ├── VideoConstant.java │ │ │ ├── VideoListAdapter.java │ │ │ └── WebViewActivity.java │ │ └── res/ │ │ ├── drawable/ │ │ │ ├── share_selector.xml │ │ │ └── skin_seek_progress.xml │ │ ├── layout/ │ │ │ ├── activity_auto_tiny.xml │ │ │ ├── activity_auto_tiny_list.xml │ │ │ ├── activity_directly_play.xml │ │ │ ├── activity_listview.xml │ │ │ ├── activity_listview_content.xml │ │ │ ├── activity_listview_viewpager.xml │ │ │ ├── activity_loadimage.xml │ │ │ ├── activity_main.xml │ │ │ ├── activity_recyclerview_content.xml │ │ │ ├── activity_ui.xml │ │ │ ├── activity_ui_big_change.xml │ │ │ ├── activity_ui_small_change.xml │ │ │ ├── activity_webview.xml │ │ │ ├── header_auto_tiny_normal.xml │ │ │ ├── item_textview.xml │ │ │ ├── item_videoview.xml │ │ │ ├── layout_list.xml │ │ │ ├── layout_standard_fresco.xml │ │ │ └── layout_standard_with_share_button.xml │ │ ├── values/ │ │ │ ├── colors.xml │ │ │ ├── dimens.xml │ │ │ ├── strings.xml │ │ │ └── styles.xml │ │ └── values-w820dp/ │ │ └── dimens.xml │ └── test/ │ └── java/ │ └── fm/ │ └── jiecao/ │ └── jiecaovideoplayer/ │ └── ExampleUnitTest.java ├── MaterialRefresh_library/ │ ├── .gitignore │ ├── build.gradle │ └── src/ │ └── main/ │ ├── AndroidManifest.xml │ ├── java/ │ │ └── com/ │ │ └── cjj/ │ │ ├── CircleProgressBar.java │ │ ├── MaterialFoodView.java │ │ ├── MaterialFooterView.java │ │ ├── MaterialHeadListener.java │ │ ├── MaterialHeadView.java │ │ ├── MaterialHeaderView.java │ │ ├── MaterialProgressDrawable.java │ │ ├── MaterialRefreshLayout.java │ │ ├── MaterialRefreshListener.java │ │ ├── MaterialWaveView.java │ │ ├── SunFaceView.java │ │ ├── SunLayout.java │ │ ├── SunLineView.java │ │ └── Util.java │ └── res/ │ └── values/ │ ├── attrs.xml │ ├── attrs_circle_progressbar.xml │ ├── colors.xml │ └── strings.xml ├── PhotoView-master/ │ ├── build.gradle │ └── src/ │ └── main/ │ ├── AndroidManifest.xml │ ├── java/ │ │ └── uk/ │ │ └── co/ │ │ └── senab/ │ │ └── photoview/ │ │ └── sample/ │ │ ├── ActivityTransitionActivity.java │ │ ├── ActivityTransitionToActivity.java │ │ ├── HackyDrawerLayout.java │ │ ├── HackyViewPager.java │ │ ├── ImageAdapter.java │ │ ├── ImageViewHolder.java │ │ ├── LauncherActivity.java │ │ ├── PicassoSampleActivity.java │ │ ├── RotationSampleActivity.java │ │ ├── SimpleSampleActivity.java │ │ └── ViewPagerActivity.java │ └── res/ │ ├── layout/ │ │ ├── activity_launcher.xml │ │ ├── activity_main.xml │ │ ├── activity_simple.xml │ │ ├── activity_transition.xml │ │ ├── activity_transition_to.xml │ │ ├── activity_view_pager.xml │ │ ├── item_image.xml │ │ └── item_list_item.xml │ ├── menu/ │ │ └── main_menu.xml │ └── values/ │ ├── colors.xml │ ├── strings.xml │ ├── styles.xml │ └── transitions.xml ├── PhotoView_library/ │ ├── LICENSE │ ├── build.gradle │ ├── gradle.properties │ └── src/ │ └── main/ │ ├── AndroidManifest.xml │ └── java/ │ └── uk/ │ └── co/ │ └── senab/ │ └── photoview/ │ ├── Compat.java │ ├── DefaultOnDoubleTapListener.java │ ├── IPhotoView.java │ ├── PhotoView.java │ ├── PhotoViewAttacher.java │ ├── gestures/ │ │ ├── CupcakeGestureDetector.java │ │ ├── EclairGestureDetector.java │ │ ├── FroyoGestureDetector.java │ │ ├── GestureDetector.java │ │ ├── OnGestureListener.java │ │ └── VersionedGestureDetector.java │ ├── log/ │ │ ├── LogManager.java │ │ ├── Logger.java │ │ └── LoggerDefault.java │ └── scrollerproxy/ │ ├── GingerScroller.java │ ├── IcsScroller.java │ ├── PreGingerScroller.java │ └── ScrollerProxy.java ├── README.md ├── RecyclerViewDemo/ │ ├── .gitignore │ ├── build.gradle │ ├── proguard-rules.pro │ └── src/ │ ├── androidTest/ │ │ └── java/ │ │ └── com/ │ │ └── atguigu/ │ │ └── recyclerviewdemo/ │ │ └── ExampleInstrumentedTest.java │ ├── main/ │ │ ├── AndroidManifest.xml │ │ ├── java/ │ │ │ └── com/ │ │ │ └── atguigu/ │ │ │ └── recyclerviewdemo/ │ │ │ ├── DividerItemDecoration.java │ │ │ ├── MainActivity.java │ │ │ └── RecyclerDemoAdapter.java │ │ └── res/ │ │ ├── drawable/ │ │ │ └── divider_bg.xml │ │ ├── layout/ │ │ │ ├── activity_main.xml │ │ │ └── item.xml │ │ ├── values/ │ │ │ ├── colors.xml │ │ │ ├── dimens.xml │ │ │ ├── strings.xml │ │ │ └── styles.xml │ │ └── values-w820dp/ │ │ └── dimens.xml │ └── test/ │ └── java/ │ └── com/ │ └── atguigu/ │ └── recyclerviewdemo/ │ └── ExampleUnitTest.java ├── SpeechDemo2/ │ ├── .gitignore │ ├── build.gradle │ ├── libs/ │ │ ├── Msc.jar │ │ └── Sunflower.jar │ ├── proguard-rules.pro │ └── src/ │ ├── androidTest/ │ │ └── java/ │ │ └── com/ │ │ └── atguigu/ │ │ └── speechdemo2/ │ │ └── ExampleInstrumentedTest.java │ ├── main/ │ │ ├── AndroidManifest.xml │ │ ├── assets/ │ │ │ └── iflytek/ │ │ │ └── recognize.xml │ │ ├── java/ │ │ │ └── com/ │ │ │ └── atguigu/ │ │ │ └── speechdemo2/ │ │ │ ├── JsonParser.java │ │ │ └── MainActivity.java │ │ └── res/ │ │ ├── layout/ │ │ │ └── activity_main.xml │ │ ├── values/ │ │ │ ├── colors.xml │ │ │ ├── dimens.xml │ │ │ ├── strings.xml │ │ │ └── styles.xml │ │ └── values-w820dp/ │ │ └── dimens.xml │ └── test/ │ └── java/ │ └── com/ │ └── atguigu/ │ └── speechdemo2/ │ └── ExampleUnitTest.java ├── StartAllVideoPlayer/ │ ├── .gitignore │ ├── build.gradle │ ├── proguard-rules.pro │ └── src/ │ ├── androidTest/ │ │ └── java/ │ │ └── com/ │ │ └── atguigu/ │ │ └── startallvideoplayer/ │ │ └── ExampleInstrumentedTest.java │ ├── main/ │ │ ├── AndroidManifest.xml │ │ ├── java/ │ │ │ └── com/ │ │ │ └── atguigu/ │ │ │ └── startallvideoplayer/ │ │ │ └── MainActivity.java │ │ └── res/ │ │ ├── layout/ │ │ │ └── activity_main.xml │ │ ├── values/ │ │ │ ├── colors.xml │ │ │ ├── dimens.xml │ │ │ ├── strings.xml │ │ │ └── styles.xml │ │ └── values-w820dp/ │ │ └── dimens.xml │ └── test/ │ └── java/ │ └── com/ │ └── atguigu/ │ └── startallvideoplayer/ │ └── ExampleUnitTest.java ├── SurfaceViewDemo/ │ ├── .gitignore │ ├── build.gradle │ └── src/ │ └── main/ │ ├── AndroidManifest.xml │ ├── java/ │ │ └── com/ │ │ └── example/ │ │ └── videotest/ │ │ ├── Constants.java │ │ ├── MainActivity.java │ │ ├── MediaPlayUtil.java │ │ └── SurfaceViewTestActivity.java │ └── res/ │ ├── layout/ │ │ ├── activity_main.xml │ │ └── activity_surface_view_test.xml │ ├── values/ │ │ ├── strings.xml │ │ └── styles.xml │ ├── values-v11/ │ │ └── styles.xml │ └── values-v14/ │ └── styles.xml ├── app/ │ ├── .gitignore │ ├── build.gradle │ ├── libs/ │ │ ├── Msc.jar │ │ ├── Sunflower.jar │ │ └── picasso-2.5.2.jar │ ├── proguard-rules.pro │ └── src/ │ ├── androidTest/ │ │ └── java/ │ │ └── com/ │ │ └── atguigu/ │ │ └── mobileplayer1020/ │ │ └── ExampleInstrumentedTest.java │ ├── main/ │ │ ├── AndroidManifest.xml │ │ ├── aidl/ │ │ │ └── com/ │ │ │ └── atguigu/ │ │ │ └── mobileplayer1020/ │ │ │ └── IMusicPlayerService.aidl │ │ ├── assets/ │ │ │ └── iflytek/ │ │ │ └── recognize.xml │ │ ├── java/ │ │ │ └── com/ │ │ │ └── atguigu/ │ │ │ └── mobileplayer1020/ │ │ │ ├── MainActivity.java │ │ │ ├── WelcomeActivity.java │ │ │ ├── activity/ │ │ │ │ ├── PicassoSampleActivity.java │ │ │ │ ├── SearchActivity.java │ │ │ │ ├── SystemAudioPlayerActivity.java │ │ │ │ ├── SystemVideoPlayerActivity.java │ │ │ │ └── VitamioVideoPlayerActivity.java │ │ │ ├── adapter/ │ │ │ │ ├── LocalVideoAdapter.java │ │ │ │ ├── NetAudioFragmentAdapter.java │ │ │ │ ├── NetVideoAdapter.java │ │ │ │ ├── RecyclerFragmentAdapter.java │ │ │ │ └── SearchAdapter.java │ │ │ ├── app/ │ │ │ │ └── MyApplication.java │ │ │ ├── base/ │ │ │ │ └── BaseFragment.java │ │ │ ├── bean/ │ │ │ │ ├── LyricBean.java │ │ │ │ ├── MediaItem.java │ │ │ │ ├── NetAudioBean.java │ │ │ │ └── SearchBean.java │ │ │ ├── fragment/ │ │ │ │ ├── LocalAudioFragment.java │ │ │ │ ├── LocalVideoFragment.java │ │ │ │ ├── NetAudioFragment.java │ │ │ │ ├── NetVideoFragment.java │ │ │ │ └── RecyclerViewFragment.java │ │ │ ├── service/ │ │ │ │ └── MusicPlayerService.java │ │ │ ├── utils/ │ │ │ │ ├── CacheUtils.java │ │ │ │ ├── Constant.java │ │ │ │ ├── DensityUtil.java │ │ │ │ ├── JsonParser.java │ │ │ │ ├── LyricParaser.java │ │ │ │ └── Utils.java │ │ │ └── view/ │ │ │ ├── BaseVisualizerView.java │ │ │ ├── LyricShowView.java │ │ │ ├── TitleBarView.java │ │ │ ├── VideoView.java │ │ │ └── VitamioVideoView.java │ │ └── res/ │ │ ├── drawable/ │ │ │ ├── animation_list.xml │ │ │ ├── audio_progress_horizontal.xml │ │ │ ├── btn_audio_next_selector.xml │ │ │ ├── btn_audio_pause_selector.xml │ │ │ ├── btn_audio_playmode_all_selector.xml │ │ │ ├── btn_audio_playmode_normal_selector.xml │ │ │ ├── btn_audio_playmode_single_selector.xml │ │ │ ├── btn_audio_pre_selector.xml │ │ │ ├── btn_audio_start_selector.xml │ │ │ ├── btn_exit_selector.xml │ │ │ ├── btn_next_selector.xml │ │ │ ├── btn_pause_selector.xml │ │ │ ├── btn_pre_selector.xml │ │ │ ├── btn_screen_default_selector.xml │ │ │ ├── btn_screen_full_selector.xml │ │ │ ├── btn_start_selector.xml │ │ │ ├── btn_swich_lyric_selector.xml │ │ │ ├── btn_swiche_player_selector.xml │ │ │ ├── btn_voice_selector.xml │ │ │ ├── iv_item_picture_popup_selector.xml │ │ │ ├── progress_horizontal.xml │ │ │ ├── rb_local_audio_selector.xml │ │ │ ├── rb_local_video_selector.xml │ │ │ ├── rb_net_audio_selector.xml │ │ │ ├── rb_net_video_selector.xml │ │ │ ├── rb_textcolor_selector.xml │ │ │ ├── shape_red.xml │ │ │ ├── shape_sousuo_bg.xml │ │ │ ├── shape_sousuo_bg_pressed.xml │ │ │ ├── shenhe_cai_pic_night_selector.xml │ │ │ ├── shenhe_ding_pic_selector.xml │ │ │ ├── text_color_selector.xml │ │ │ ├── tv_search_drawable.xml │ │ │ ├── tv_search_selector.xml │ │ │ └── tv_search_textcolor.xml │ │ ├── layout/ │ │ │ ├── activity_main.xml │ │ │ ├── activity_picasso_sample.xml │ │ │ ├── activity_search.xml │ │ │ ├── activity_system_audio_player.xml │ │ │ ├── activity_system_video_player.xml │ │ │ ├── activity_test_b.xml │ │ │ ├── activity_vitamio_video_player.xml │ │ │ ├── activity_welcome.xml │ │ │ ├── ad_middle.xml │ │ │ ├── all_ad_item.xml │ │ │ ├── all_gif_item.xml │ │ │ ├── all_image_item.xml │ │ │ ├── all_text_item.xml │ │ │ ├── all_video_item.xml │ │ │ ├── buffer.xml │ │ │ ├── common_bottom.xml │ │ │ ├── common_user_info.xml │ │ │ ├── fragment_local_video.xml │ │ │ ├── fragment_net_audio.xml │ │ │ ├── fragment_net_video.xml │ │ │ ├── fragment_recyclerview.xml │ │ │ ├── gif_middle.xml │ │ │ ├── image_middle.xml │ │ │ ├── item_local_video.xml │ │ │ ├── item_net_video.xml │ │ │ ├── loading.xml │ │ │ ├── mediacontroller.xml │ │ │ ├── text_middle.xml │ │ │ ├── titlebar.xml │ │ │ └── video_middle.xml │ │ ├── values/ │ │ │ ├── colors.xml │ │ │ ├── dimens.xml │ │ │ ├── strings.xml │ │ │ └── styles.xml │ │ └── values-w820dp/ │ │ └── dimens.xml │ └── test/ │ └── java/ │ └── com/ │ └── atguigu/ │ └── mobileplayer1020/ │ └── ExampleUnitTest.java ├── binderService/ │ ├── build.gradle │ └── src/ │ └── main/ │ ├── AndroidManifest.xml │ ├── aidl/ │ │ └── com/ │ │ └── yanguangfu/ │ │ └── binder/ │ │ └── aidl/ │ │ ├── AIDLActivity.aidl │ │ ├── AIDLService.aidl │ │ └── Rect1.aidl │ ├── java/ │ │ └── com/ │ │ └── yanguangfu/ │ │ └── binder/ │ │ ├── MainActivity.java │ │ ├── MyService.java │ │ └── aidl/ │ │ └── Rect1.java │ └── res/ │ ├── layout/ │ │ └── activity_main.xml │ └── values/ │ └── strings.xml ├── build.gradle ├── gradle/ │ └── wrapper/ │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradle.properties ├── gradlew ├── gradlew.bat ├── jcvideoplayer-lib/ │ ├── .gitignore │ ├── build.gradle │ ├── proguard-rules.pro │ └── src/ │ ├── androidTest/ │ │ └── java/ │ │ └── fm/ │ │ └── jiecao/ │ │ └── jcvideoplayer_lib/ │ │ └── ApplicationTest.java │ ├── main/ │ │ ├── AndroidManifest.xml │ │ ├── java/ │ │ │ └── fm/ │ │ │ └── jiecao/ │ │ │ └── jcvideoplayer_lib/ │ │ │ ├── JCMediaManager.java │ │ │ ├── JCMediaPlayerListener.java │ │ │ ├── JCResizeImageView.java │ │ │ ├── JCResizeTextureView.java │ │ │ ├── JCUserAction.java │ │ │ ├── JCUserActionStandard.java │ │ │ ├── JCUtils.java │ │ │ ├── JCVideoPlayer.java │ │ │ ├── JCVideoPlayerManager.java │ │ │ ├── JCVideoPlayerSimple.java │ │ │ └── JCVideoPlayerStandard.java │ │ └── res/ │ │ ├── anim/ │ │ │ ├── quit_fullscreen.xml │ │ │ └── start_fullscreen.xml │ │ ├── drawable/ │ │ │ ├── jc_click_back_tiny_selector.xml │ │ │ ├── jc_click_error_selector.xml │ │ │ ├── jc_click_pause_selector.xml │ │ │ ├── jc_click_play_selector.xml │ │ │ ├── jc_dialog_progress.xml │ │ │ ├── jc_dialog_progress_bg.xml │ │ │ ├── jc_loading.xml │ │ │ ├── jc_progress.xml │ │ │ ├── jc_seek_progress.xml │ │ │ ├── jc_seek_thumb.xml │ │ │ ├── jc_seek_thumb_normal.xml │ │ │ ├── jc_seek_thumb_pressed.xml │ │ │ ├── jc_title_bg.xml │ │ │ └── jc_volume_progress_bg.xml │ │ ├── layout/ │ │ │ ├── jc_layout_base.xml │ │ │ ├── jc_layout_standard.xml │ │ │ ├── jc_progress_dialog.xml │ │ │ └── jc_volume_dialog.xml │ │ ├── values/ │ │ │ ├── colors.xml │ │ │ ├── dimens.xml │ │ │ ├── strings.xml │ │ │ └── styles.xml │ │ ├── values-pt/ │ │ │ └── strings.xml │ │ ├── values-tr/ │ │ │ └── strings.xml │ │ └── values-zh/ │ │ └── strings.xml │ └── test/ │ └── java/ │ └── fm/ │ └── jiecao/ │ └── jcvideoplayer_lib/ │ └── ExampleUnitTest.java ├── settings.gradle ├── speechDemo/ │ ├── build.gradle │ ├── libs/ │ │ ├── Msc.jar │ │ └── Sunflower.jar │ ├── lint.xml │ └── src/ │ └── main/ │ ├── AndroidManifest.xml │ ├── assets/ │ │ ├── call.bnf │ │ ├── grammar_sample.abnf │ │ ├── iflytek/ │ │ │ └── recognize.xml │ │ ├── keys │ │ └── userwords │ ├── java/ │ │ └── com/ │ │ └── iflytek/ │ │ ├── ise/ │ │ │ └── result/ │ │ │ ├── FinalResult.java │ │ │ ├── ReadSentenceResult.java │ │ │ ├── ReadSyllableResult.java │ │ │ ├── ReadWordResult.java │ │ │ ├── Result.java │ │ │ ├── entity/ │ │ │ │ ├── Phone.java │ │ │ │ ├── Sentence.java │ │ │ │ ├── Syll.java │ │ │ │ └── Word.java │ │ │ ├── util/ │ │ │ │ ├── ResultFormatUtil.java │ │ │ │ └── ResultTranslateUtil.java │ │ │ └── xml/ │ │ │ └── XmlResultParser.java │ │ ├── speech/ │ │ │ ├── setting/ │ │ │ │ ├── IatSettings.java │ │ │ │ ├── IseSettings.java │ │ │ │ ├── TtsSettings.java │ │ │ │ └── UnderstanderSettings.java │ │ │ └── util/ │ │ │ ├── ApkInstaller.java │ │ │ ├── FucUtil.java │ │ │ ├── JsonParser.java │ │ │ ├── SettingTextWatcher.java │ │ │ └── XmlParser.java │ │ └── voicedemo/ │ │ ├── AsrDemo.java │ │ ├── IatDemo.java │ │ ├── IseDemo.java │ │ ├── MainActivity.java │ │ ├── SpeechApp.java │ │ ├── TtsDemo.java │ │ └── UnderstanderDemo.java │ └── res/ │ ├── drawable/ │ │ ├── list_bg_color.xml │ │ └── main_setting_btn_np.xml │ ├── layout/ │ │ ├── iatdemo.xml │ │ ├── isedemo.xml │ │ ├── isrdemo.xml │ │ ├── list_items.xml │ │ ├── main.xml │ │ ├── title.xml │ │ ├── ttsdemo.xml │ │ └── understander.xml │ ├── values/ │ │ ├── colors.xml │ │ ├── dimen.xml │ │ ├── strings.xml │ │ └── styles.xml │ └── xml/ │ ├── iat_setting.xml │ ├── ise_settings.xml │ ├── tts_setting.xml │ └── understand_setting.xml ├── vitamio/ │ ├── .classpath │ ├── .gitignore │ ├── .project │ ├── .settings/ │ │ └── org.eclipse.jdt.core.prefs │ ├── AndroidManifest.xml │ ├── README.md │ ├── build.gradle │ ├── gen/ │ │ └── io/ │ │ └── vov/ │ │ └── vitamio/ │ │ ├── BuildConfig.java │ │ └── R.java │ ├── proguard-project.txt │ ├── project.properties │ ├── res/ │ │ ├── drawable/ │ │ │ ├── mediacontroller_button.xml │ │ │ ├── scrubber_control_selector_holo.xml │ │ │ └── scrubber_progress_horizontal_holo_dark.xml │ │ ├── layout/ │ │ │ └── mediacontroller.xml │ │ └── values/ │ │ ├── colors.xml │ │ ├── strings.xml │ │ └── styles.xml │ └── src/ │ └── io/ │ └── vov/ │ └── vitamio/ │ ├── EGL.java │ ├── MediaFile.java │ ├── MediaFormat.java │ ├── MediaMetadataRetriever.java │ ├── MediaPlayer.java │ ├── MediaScanner.java │ ├── MediaScannerClient.java │ ├── Metadata.java │ ├── ThumbnailUtils.java │ ├── VIntent.java │ ├── Vitamio.java │ ├── VitamioLicense.java │ ├── activity/ │ │ └── InitActivity.java │ ├── provider/ │ │ ├── MediaStore.java │ │ └── MiniThumbFile.java │ ├── utils/ │ │ ├── Base64.java │ │ ├── CPU.java │ │ ├── ContextUtils.java │ │ ├── Crypto.java │ │ ├── Device.java │ │ ├── FileUtils.java │ │ ├── IOUtils.java │ │ ├── Log.java │ │ ├── ScreenResolution.java │ │ └── StringUtils.java │ └── widget/ │ ├── CenterLayout.java │ ├── MediaController.java │ ├── OutlineTextView.java │ └── VideoView.java ├── vitamio-sample/ │ ├── .classpath │ ├── .gitignore │ ├── .project │ ├── .settings/ │ │ └── org.eclipse.jdt.core.prefs │ ├── AndroidManifest.xml │ ├── README.md │ ├── build.gradle │ ├── gen/ │ │ └── io/ │ │ └── vov/ │ │ └── vitamio/ │ │ ├── R.java │ │ └── demo/ │ │ ├── BuildConfig.java │ │ └── R.java │ ├── libs/ │ │ └── umeng-analytics-v5.6.1.jar │ ├── lint.xml │ ├── proguard-project.txt │ ├── project.properties │ ├── res/ │ │ ├── layout/ │ │ │ ├── media_metadata.xml │ │ │ ├── mediaplayer_1.xml │ │ │ ├── mediaplayer_2.xml │ │ │ ├── mediaplayer_3.xml │ │ │ ├── subtitle1.xml │ │ │ ├── subtitle2.xml │ │ │ ├── videobuffer.xml │ │ │ └── videoview.xml │ │ └── values/ │ │ ├── strings.xml │ │ └── styles.xml │ └── src/ │ └── io/ │ └── vov/ │ └── vitamio/ │ └── demo/ │ ├── MediaMetadataRetrieverDemo.java │ ├── MediaPlayerDemo.java │ ├── MediaPlayerDemo_Audio.java │ ├── MediaPlayerDemo_Video.java │ ├── MediaPlayerDemo_setSurface.java │ ├── MediaPlayerSubtitle.java │ ├── VideoSubtitleList.java │ ├── VideoViewBuffer.java │ ├── VideoViewDemo.java │ ├── VideoViewSubtitle.java │ └── VitamioListActivity.java ├── voicedialog/ │ ├── .gitignore │ ├── build.gradle │ ├── libs/ │ │ ├── Msc.jar │ │ └── Sunflower.jar │ ├── proguard-rules.pro │ └── src/ │ ├── androidTest/ │ │ └── java/ │ │ └── com/ │ │ └── atguigu/ │ │ └── voicedialog/ │ │ └── ApplicationTest.java │ ├── main/ │ │ ├── AndroidManifest.xml │ │ ├── assets/ │ │ │ └── iflytek/ │ │ │ └── recognize.xml │ │ ├── java/ │ │ │ └── com/ │ │ │ └── atguigu/ │ │ │ └── voicedialog/ │ │ │ ├── ConversationInfo.java │ │ │ ├── MainActivity.java │ │ │ ├── MyApplication.java │ │ │ ├── ResouesUtils.java │ │ │ ├── SpeechBean.java │ │ │ └── SpeechUtils.java │ │ └── res/ │ │ ├── layout/ │ │ │ ├── activity_main.xml │ │ │ └── listview_item.xml │ │ ├── values/ │ │ │ ├── colors.xml │ │ │ ├── dimens.xml │ │ │ ├── strings.xml │ │ │ └── styles.xml │ │ └── values-w820dp/ │ │ └── dimens.xml │ └── test/ │ └── java/ │ └── com/ │ └── atguigu/ │ └── voicedialog/ │ └── ExampleUnitTest.java ├── xUtils3-master/ │ ├── .gitignore │ ├── build.gradle │ ├── debug.keystore │ ├── proguard-rules.pro │ └── src/ │ └── main/ │ ├── AndroidManifest.xml │ ├── java/ │ │ └── org/ │ │ └── xutils/ │ │ └── sample/ │ │ ├── BaseActivity.java │ │ ├── BaseFragment.java │ │ ├── BigImageActivity.java │ │ ├── DbFragment.java │ │ ├── DownloadActivity.java │ │ ├── HttpFragment.java │ │ ├── ImageFragment.java │ │ ├── MainActivity.java │ │ ├── MyApplication.java │ │ ├── db/ │ │ │ ├── Child.java │ │ │ └── Parent.java │ │ ├── download/ │ │ │ ├── DefaultDownloadViewHolder.java │ │ │ ├── DownloadCallback.java │ │ │ ├── DownloadInfo.java │ │ │ ├── DownloadManager.java │ │ │ ├── DownloadState.java │ │ │ ├── DownloadStateConverter.java │ │ │ └── DownloadViewHolder.java │ │ └── http/ │ │ ├── BaiduParams.java │ │ ├── BaiduResponse.java │ │ ├── JsonDemoParams.java │ │ ├── JsonDemoParamsBuilder.java │ │ └── JsonResponseParser.java │ └── res/ │ ├── layout/ │ │ ├── activity_big_image.xml │ │ ├── activity_download.xml │ │ ├── activity_main.xml │ │ ├── download_item.xml │ │ ├── fragment_db.xml │ │ ├── fragment_http.xml │ │ ├── fragment_image.xml │ │ └── image_item.xml │ ├── menu/ │ │ └── menu_main.xml │ ├── values/ │ │ ├── colors.xml │ │ ├── dimens.xml │ │ ├── strings.xml │ │ └── styles.xml │ ├── values-v21/ │ │ └── styles.xml │ └── values-w820dp/ │ └── dimens.xml └── xutils/ ├── .gitignore ├── build.gradle ├── docs/ │ ├── 1.快速使用.md │ ├── 2.任务和回调.md │ ├── 3.网络请求.md │ ├── 4.图片绑定.md │ ├── 5.Sqlite数据库使用.md │ └── 6.View注入.md └── src/ └── main/ ├── AndroidManifest.xml ├── java/ │ └── org/ │ └── xutils/ │ ├── DbManager.java │ ├── HttpManager.java │ ├── ImageManager.java │ ├── ViewInjector.java │ ├── cache/ │ │ ├── DiskCacheEntity.java │ │ ├── DiskCacheFile.java │ │ ├── LruCache.java │ │ └── LruDiskCache.java │ ├── common/ │ │ ├── Callback.java │ │ ├── TaskController.java │ │ ├── task/ │ │ │ ├── AbsTask.java │ │ │ ├── Priority.java │ │ │ ├── PriorityExecutor.java │ │ │ ├── PriorityRunnable.java │ │ │ ├── TaskControllerImpl.java │ │ │ └── TaskProxy.java │ │ └── util/ │ │ ├── DensityUtil.java │ │ ├── DoubleKeyValueMap.java │ │ ├── FileUtil.java │ │ ├── IOUtil.java │ │ ├── KeyValue.java │ │ ├── LogUtil.java │ │ ├── MD5.java │ │ ├── ParameterizedTypeUtil.java │ │ └── ProcessLock.java │ ├── config/ │ │ └── DbConfigs.java │ ├── db/ │ │ ├── CursorUtils.java │ │ ├── DbManagerImpl.java │ │ ├── DbModelSelector.java │ │ ├── Selector.java │ │ ├── annotation/ │ │ │ ├── Column.java │ │ │ └── Table.java │ │ ├── converter/ │ │ │ ├── BooleanColumnConverter.java │ │ │ ├── ByteArrayColumnConverter.java │ │ │ ├── ByteColumnConverter.java │ │ │ ├── CharColumnConverter.java │ │ │ ├── ColumnConverter.java │ │ │ ├── ColumnConverterFactory.java │ │ │ ├── DateColumnConverter.java │ │ │ ├── DoubleColumnConverter.java │ │ │ ├── FloatColumnConverter.java │ │ │ ├── IntegerColumnConverter.java │ │ │ ├── LongColumnConverter.java │ │ │ ├── ShortColumnConverter.java │ │ │ ├── SqlDateColumnConverter.java │ │ │ └── StringColumnConverter.java │ │ ├── sqlite/ │ │ │ ├── ColumnDbType.java │ │ │ ├── SqlInfo.java │ │ │ ├── SqlInfoBuilder.java │ │ │ └── WhereBuilder.java │ │ └── table/ │ │ ├── ColumnEntity.java │ │ ├── ColumnUtils.java │ │ ├── DbBase.java │ │ ├── DbModel.java │ │ ├── TableEntity.java │ │ └── TableUtils.java │ ├── ex/ │ │ ├── BaseException.java │ │ ├── DbException.java │ │ ├── FileLockedException.java │ │ ├── HttpException.java │ │ └── HttpRedirectException.java │ ├── http/ │ │ ├── BaseParams.java │ │ ├── HttpManagerImpl.java │ │ ├── HttpMethod.java │ │ ├── HttpTask.java │ │ ├── ProgressHandler.java │ │ ├── RequestParams.java │ │ ├── RequestParamsHelper.java │ │ ├── RequestTrackerWrapper.java │ │ ├── annotation/ │ │ │ ├── HttpRequest.java │ │ │ └── HttpResponse.java │ │ ├── app/ │ │ │ ├── DefaultParamsBuilder.java │ │ │ ├── HttpRetryHandler.java │ │ │ ├── InputStreamResponseParser.java │ │ │ ├── ParamsBuilder.java │ │ │ ├── RedirectHandler.java │ │ │ ├── RequestInterceptListener.java │ │ │ ├── RequestTracker.java │ │ │ └── ResponseParser.java │ │ ├── body/ │ │ │ ├── BodyItemWrapper.java │ │ │ ├── FileBody.java │ │ │ ├── InputStreamBody.java │ │ │ ├── MultipartBody.java │ │ │ ├── ProgressBody.java │ │ │ ├── RequestBody.java │ │ │ ├── StringBody.java │ │ │ └── UrlEncodedParamsBody.java │ │ ├── cookie/ │ │ │ ├── CookieEntity.java │ │ │ └── DbCookieStore.java │ │ ├── loader/ │ │ │ ├── BooleanLoader.java │ │ │ ├── ByteArrayLoader.java │ │ │ ├── FileLoader.java │ │ │ ├── IntegerLoader.java │ │ │ ├── JSONArrayLoader.java │ │ │ ├── JSONObjectLoader.java │ │ │ ├── Loader.java │ │ │ ├── LoaderFactory.java │ │ │ ├── ObjectLoader.java │ │ │ └── StringLoader.java │ │ └── request/ │ │ ├── AssetsRequest.java │ │ ├── HttpRequest.java │ │ ├── LocalFileRequest.java │ │ ├── UriRequest.java │ │ └── UriRequestFactory.java │ ├── image/ │ │ ├── AsyncDrawable.java │ │ ├── GifDrawable.java │ │ ├── ImageAnimationHelper.java │ │ ├── ImageDecoder.java │ │ ├── ImageLoader.java │ │ ├── ImageManagerImpl.java │ │ ├── ImageOptions.java │ │ ├── MemCacheKey.java │ │ ├── ReusableBitmapDrawable.java │ │ └── ReusableDrawable.java │ ├── view/ │ │ ├── EventListenerManager.java │ │ ├── ViewFinder.java │ │ ├── ViewInfo.java │ │ ├── ViewInjectorImpl.java │ │ └── annotation/ │ │ ├── ContentView.java │ │ ├── Event.java │ │ └── ViewInject.java │ └── x.java └── java_compat/ └── android/ └── backport/ └── webp/ └── WebPFactory.java ================================================ FILE CONTENTS ================================================ ================================================ FILE: .gitignore ================================================ .gradle .idea build *.iml /local.properties /bin ================================================ FILE: AgoraDemo/.gitignore ================================================ /build ================================================ FILE: AgoraDemo/build.gradle ================================================ apply plugin: 'com.android.application' android { compileSdkVersion 21 buildToolsVersion "23.0.2" defaultConfig { applicationId "io.agora.demo.agora" minSdkVersion 14 targetSdkVersion 21 versionCode 20150915 versionName "1.0" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } // sourceSets { // main { // jniLibs.srcDirs = ['../../libs'] // } // } } dependencies { compile fileTree(include: ['*.jar'], dir: '../../libs') compile 'com.android.support:appcompat-v7:21.0.3' compile files('libs/agora-rtc-sdk.jar') compile files('libs/android-async-http-1.4.8.jar') compile files('libs/crasheye.jar') compile files('libs/fastjson.jar') } ================================================ FILE: AgoraDemo/proguard-rules.pro ================================================ # Add project specific ProGuard rules here. # By default, the flags in this file are appended to flags specified # in /Users/apple/Library/Android/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 *; #} ================================================ FILE: AgoraDemo/src/androidTest/java/io/agora/demo/agora/ApplicationTest.java ================================================ package io.agora.demo.agora; import android.app.Application; import android.test.ApplicationTestCase; /** * Testing Fundamentals */ public class ApplicationTest extends ApplicationTestCase { public ApplicationTest() { super(Application.class); } } ================================================ FILE: AgoraDemo/src/main/AndroidManifest.xml ================================================ ================================================ FILE: AgoraDemo/src/main/java/io/agora/demo/agora/AgoraApplication.java ================================================ package io.agora.demo.agora; import android.app.Application; import android.content.Context; import android.util.Log; import com.xsj.crasheye.Crasheye; import io.agora.rtc.RtcEngine; /** * Created by apple on 15/9/9. */ public class AgoraApplication extends Application { private RtcEngine rtcEngine; private MessageHandler messageHandler; @Override public void onCreate(){ super.onCreate(); Crasheye.initWithNativeHandle(this, "06798b00"); messageHandler = new MessageHandler(); } /** * Test vendor key: 6D7A26A1D3554A54A9F43BE6797FE3E2 * @param vendorKey */ public void setRtcEngine(String vendorKey){ if(rtcEngine==null) { rtcEngine = RtcEngine.create(getApplicationContext(), vendorKey, messageHandler); } } public RtcEngine getRtcEngine(){ return rtcEngine; } public void setEngineEventHandlerActivity(BaseEngineEventHandlerActivity engineEventHandlerActivity){ messageHandler.setActivity(engineEventHandlerActivity); } } ================================================ FILE: AgoraDemo/src/main/java/io/agora/demo/agora/BaseActivity.java ================================================ package io.agora.demo.agora; import android.os.Bundle; import android.os.PersistableBundle; import android.support.v4.app.FragmentActivity; import android.view.View; import io.agora.demo.agora.util.LoggingUtils; /** * Provide basic func for all activities used in App * * Created by on 9/12/15. */ public class BaseActivity extends FragmentActivity{ @Override public void onCreate(Bundle savedInstanceState, PersistableBundle persistentState) { super.onCreate(savedInstanceState, persistentState); } protected void onPause() { super.onPause(); } protected void onResume() { super.onResume(); } // Global view click listener private View.OnClickListener onClickListener = new View.OnClickListener() { @Override public void onClick(View view) { onUserInteraction(view); } }; public View.OnClickListener getViewClickListener(){ return onClickListener; } /** * Central point of handling all view click events * @param view */ public void onUserInteraction(View view){ } public void log(Object obj) { // You can use filter *** to filter out message LoggingUtils.error(getClass().getName(), String.format("*** %s ***", obj == null ? "--!--" : obj.toString())); } } ================================================ FILE: AgoraDemo/src/main/java/io/agora/demo/agora/BaseEngineEventHandlerActivity.java ================================================ package io.agora.demo.agora; import io.agora.rtc.IRtcEngineEventHandler; /** * * A handler activity act as a bridge to take callbacks from @MessageHandler. * Subclasses should override these key methods. * * Created by on 9/13/15. */ public class BaseEngineEventHandlerActivity extends BaseActivity { public void onJoinChannelSuccess(String channel, int uid, int elapsed) { } public void onRejoinChannelSuccess(String channel, int uid, int elapsed) { } public void onError(int err) { } public void onCameraReady() { } public void onAudioQuality(int uid, int quality, short delay, short lost) { } public void onAudioTransportQuality(int uid, short delay, short lost) { } public void onVideoTransportQuality(int uid, short delay, short lost) { } public void onLeaveChannel(IRtcEngineEventHandler.RtcStats stats) { } public void onUpdateSessionStats(IRtcEngineEventHandler.RtcStats stats) { } public void onRecap(byte[] recap) { } public void onAudioVolumeIndication(IRtcEngineEventHandler.AudioVolumeInfo[] speakers, int totalVolume) { } public void onNetworkQuality(int quality) { } public void onUserJoined(int uid, int elapsed) { } public void onUserOffline(int uid) { } public void onUserMuteAudio(int uid, boolean muted) { } public void onUserMuteVideo(int uid, boolean muted) { } public void onAudioRecorderException(int nLastTimeStamp) { } public void onRemoteVideoStat(int uid, int frameCount, int delay, int receivedBytes) { } public void onLocalVideoStat(int sentBytes, int sentFrames) { } public void onFirstRemoteVideoFrame(int uid, int width, int height, int elapsed) { } public void onFirstLocalVideoFrame(int width, int height, int elapsed) { } public void onFirstRemoteVideoDecoded(int uid, int width, int height, int elapsed) { } public void onConnectionLost() { } public void onMediaEngineEvent(int code) { } } ================================================ FILE: AgoraDemo/src/main/java/io/agora/demo/agora/ChannelActivity.java ================================================ package io.agora.demo.agora; import android.app.AlertDialog; import android.content.DialogInterface; import android.content.Intent; import android.content.res.Configuration; import android.os.Bundle; import android.util.TypedValue; import android.view.LayoutInflater; import android.view.Menu; import android.view.SurfaceView; import android.view.View; import android.view.WindowManager; import android.widget.CheckBox; import android.widget.CompoundButton; import android.widget.FrameLayout; import android.widget.LinearLayout; import android.widget.TextView; import java.util.Random; import java.util.Timer; import java.util.TimerTask; import io.agora.demo.agora.util.NetworkConnectivityUtils; import io.agora.rtc.IRtcEngineEventHandler; import io.agora.rtc.RtcEngine; import io.agora.rtc.video.VideoCanvas; /** * some refs: *

* 1. http://stackoverflow.com/questions/6026625/layout-design-surfaceview-doesnt-display * 2. http://stackoverflow.com/questions/1096618/android-surfaceview-scrolling/2216788#2216788 */ /** * Created by apple on 15/9/9. */ public class ChannelActivity extends BaseEngineEventHandlerActivity { public final static int CALLING_TYPE_VIDEO = 0x100; public final static int CALLING_TYPE_VOICE = 0x101; public final static String EXTRA_CALLING_TYPE = "EXTRA_CALLING_TYPE"; public final static String EXTRA_VENDOR_KEY = "EXTRA_VENDOR_KEY"; public final static String EXTRA_CHANNEL_ID = "EXTRA_CHANNEL_ID"; private int mCallingType; private SurfaceView mLocalView; private String vendorKey = ""; private String channelId = ""; private TextView mDuration; private TextView mByteCounts; private View mCameraEnabler; private View mCameraSwitcher; private LinearLayout mRemoteUserContainer; private AlertDialog alertDialog; private int time = 0; private int mLastRxBytes = 0; private int mLastTxBytes = 0; private int mLastDuration = 0; private int mRemoteUserViewWidth = 0; RtcEngine rtcEngine; @Override public void onCreate(Bundle savedInstance) { super.onCreate(savedInstance); setContentView(R.layout.activity_room); // keep screen on - turned on getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); mRemoteUserViewWidth = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 80, getResources().getDisplayMetrics()); mCallingType = getIntent().getIntExtra(EXTRA_CALLING_TYPE, CALLING_TYPE_VOICE /*default is voice call*/); setupRtcEngine(); initViews(); setupTime(); if (CALLING_TYPE_VIDEO == mCallingType) { // video call View simulateClick = new View(getApplicationContext()); simulateClick.setId(R.id.wrapper_action_video_calling); this.onUserInteraction(simulateClick); } else if (CALLING_TYPE_VOICE == mCallingType) { // voice call View simulateClick = new View(getApplicationContext()); simulateClick.setId(R.id.wrapper_action_voice_calling); this.onUserInteraction(simulateClick); } // check network if (!NetworkConnectivityUtils.isConnectedToNetwork(getApplicationContext())) { onError(104); } } void setupChannel() { String channelId = getIntent().getStringExtra(EXTRA_CHANNEL_ID); this.channelId = channelId; this.rtcEngine.joinChannel( this.vendorKey, this.channelId, "" /*optionalInfo*/, new Random().nextInt(Math.abs((int) System.currentTimeMillis()))/*optionalUid*/); ((TextView) findViewById(R.id.channel_id)).setText(String.format(getString(R.string.title_channel), channelId)); } void setupRtcEngine() { String vendorKey = getIntent().getStringExtra(EXTRA_VENDOR_KEY); this.vendorKey = vendorKey; // setup engine ((AgoraApplication) getApplication()).setRtcEngine(vendorKey); rtcEngine = ((AgoraApplication) getApplication()).getRtcEngine(); // LogUtil.log.d(getApplicationContext().getExternalFilesDir(null).toString() + "/agorasdk.log"); rtcEngine.setLogFile(getApplicationContext().getExternalFilesDir(null).toString() + "/agorasdk.log"); // setup engine event activity ((AgoraApplication) getApplication()).setEngineEventHandlerActivity(this); rtcEngine.enableVideo(); } void ensureLocalViewIsCreated() { if (this.mLocalView == null) { // local view has not been added before FrameLayout localViewContainer = (FrameLayout) findViewById(R.id.user_local_view); SurfaceView localView = rtcEngine.CreateRendererView(getApplicationContext()); this.mLocalView = localView; localViewContainer.addView(localView, new FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT, FrameLayout.LayoutParams.MATCH_PARENT)); rtcEngine.enableVideo(); rtcEngine.setupLocalVideo(new VideoCanvas(this.mLocalView)); } } /** * Initialize views and its listeners */ void initViews() { // muter CheckBox muter = (CheckBox) findViewById(R.id.action_muter); muter.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton compoundButton, boolean mutes) { rtcEngine.muteLocalAudioStream(mutes); compoundButton.setBackgroundResource(mutes ? R.drawable.ic_room_mute_pressed:R.drawable.ic_room_mute); } }); // speaker CheckBox speaker = (CheckBox) findViewById(R.id.action_speaker); speaker.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton compoundButton, boolean usesSpeaker) { rtcEngine.setEnableSpeakerphone(usesSpeaker); compoundButton.setBackgroundResource(usesSpeaker ? R.drawable.ic_room_loudspeaker : R.drawable.ic_room_loudspeaker_pressed); } }); // camera enabler CheckBox cameraEnabler = (CheckBox) findViewById(R.id.action_camera_enabler); cameraEnabler.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton compoundButton, boolean disablesCamera) { rtcEngine.muteLocalVideoStream(disablesCamera); if (disablesCamera) { findViewById(R.id.user_local_voice_bg).setVisibility(View.VISIBLE); rtcEngine.muteLocalVideoStream(true); } else { findViewById(R.id.user_local_voice_bg).setVisibility(View.GONE); rtcEngine.muteLocalVideoStream(false); } compoundButton.setBackgroundResource(disablesCamera ? R.drawable.ic_room_button_close_pressed : R.drawable.ic_room_button_close); } }); // camera switcher CheckBox cameraSwitch = (CheckBox) findViewById(R.id.action_camera_switcher); cameraSwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton compoundButton, boolean switches) { rtcEngine.switchCamera(); compoundButton.setBackgroundResource(switches ? R.drawable.ic_room_button_change_pressed : R.drawable.ic_room_button_change); } }); // setup states of action buttons muter.setChecked(false); speaker.setChecked(true); cameraEnabler.setChecked(false); cameraSwitch.setChecked(false); findViewById(R.id.wrapper_action_video_calling).setOnClickListener(getViewClickListener()); findViewById(R.id.wrapper_action_voice_calling).setOnClickListener(getViewClickListener()); findViewById(R.id.action_hung_up).setOnClickListener(getViewClickListener()); findViewById(R.id.action_back).setOnClickListener(getViewClickListener()); mDuration = (TextView) findViewById(R.id.stat_time); mByteCounts = (TextView) findViewById(R.id.stat_bytes); mCameraEnabler = findViewById(R.id.wrapper_action_camera_enabler); mCameraSwitcher = findViewById(R.id.wrapper_action_camera_switcher); mRemoteUserContainer = (LinearLayout) findViewById(R.id.user_remote_views); setRemoteUserViewVisibility(false); } void setRemoteUserViewVisibility(boolean isVisible) { findViewById(R.id.user_remote_views).getLayoutParams().height = isVisible ? (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 80, getResources().getDisplayMetrics()) : 0; } void removeBackgroundOfCallingWrapper() { findViewById(R.id.wrapper_action_video_calling).setBackgroundResource(R.drawable.shape_transparent); findViewById(R.id.wrapper_action_voice_calling).setBackgroundResource(R.drawable.shape_transparent); } void setupTime() { TimerTask task = new TimerTask() { @Override public void run() { runOnUiThread(new Runnable() { @Override public void run() { time++; if (time >= 3600) { mDuration.setText(String.format("%d:%02d:%02d", time / 3600, (time % 3600) / 60, (time % 60))); } else { mDuration.setText(String.format("%02d:%02d", (time % 3600) / 60, (time % 60))); } } }); } }; Timer timer = new Timer(); timer.schedule(task, 1000, 1000); } /** * 切换视频音频通话时,更新 view 的显示。只是更新重用的 view,并不新添加。 * * @param callingType */ void updateRemoteUserViews(int callingType) { int visibility = View.GONE; if (CALLING_TYPE_VIDEO == callingType) { visibility = View.GONE; } else if (CALLING_TYPE_VOICE == callingType) { visibility = View.VISIBLE; } for (int i = 0, size = mRemoteUserContainer.getChildCount(); i < size; i++) { View singleRemoteView = mRemoteUserContainer.getChildAt(i); singleRemoteView.findViewById(R.id.remote_user_voice_container).setVisibility(visibility); if (CALLING_TYPE_VIDEO == callingType) { // re-setup remote video FrameLayout remoteVideoUser = (FrameLayout) singleRemoteView.findViewById(R.id.viewlet_remote_video_user); // ensure remote video view setup if(remoteVideoUser.getChildCount()>0) { final SurfaceView remoteView = (SurfaceView) remoteVideoUser.getChildAt(0); if(remoteView!=null) { remoteView.setZOrderOnTop(true); remoteView.setZOrderMediaOverlay(true); int savedUid = (Integer) remoteVideoUser.getTag(); log("saved uid: " + savedUid); rtcEngine.setupRemoteVideo(new VideoCanvas(remoteView, VideoCanvas.RENDER_MODE_ADAPTIVE, savedUid)); } } } } } @Override public void onUserInteraction(View view) { switch (view.getId()) { default: super.onUserInteraction(view); break; case R.id.wrapper_action_video_calling: { mCallingType = CALLING_TYPE_VIDEO; mCameraEnabler.setVisibility(View.VISIBLE); mCameraSwitcher.setVisibility(View.VISIBLE); removeBackgroundOfCallingWrapper(); findViewById(R.id.wrapper_action_video_calling).setBackgroundResource(R.drawable.ic_room_button_yellow_bg); findViewById(R.id.user_local_voice_bg).setVisibility(View.GONE); // enable video call ensureLocalViewIsCreated(); rtcEngine.enableVideo(); rtcEngine.muteLocalVideoStream(false); rtcEngine.muteLocalAudioStream(false); rtcEngine.muteAllRemoteVideoStreams(false); // join video call if (mRemoteUserContainer.getChildCount() == 0) { this.setupChannel(); } new android.os.Handler().postDelayed(new Runnable() { @Override public void run() { updateRemoteUserViews(CALLING_TYPE_VIDEO); } },500); // ensure video camera enabler states CheckBox cameraEnabler = (CheckBox) findViewById(R.id.action_camera_enabler); cameraEnabler.setChecked(false); } break; case R.id.wrapper_action_voice_calling: { mCallingType = CALLING_TYPE_VOICE; mCameraEnabler.setVisibility(View.GONE); mCameraSwitcher.setVisibility(View.GONE); removeBackgroundOfCallingWrapper(); findViewById(R.id.wrapper_action_voice_calling).setBackgroundResource(R.drawable.ic_room_button_yellow_bg); // show background for voice call findViewById(R.id.user_local_voice_bg).setVisibility(View.VISIBLE); ensureLocalViewIsCreated(); // disable video call when necessary rtcEngine.disableVideo(); rtcEngine.muteLocalVideoStream(true); rtcEngine.muteAllRemoteVideoStreams(true); // join voice call if (mRemoteUserContainer.getChildCount() == 0) { this.setupChannel(); } new android.os.Handler().postDelayed(new Runnable() { @Override public void run() { updateRemoteUserViews(CALLING_TYPE_VOICE); } },500); } break; case R.id.action_hung_up: case R.id.action_back: { onBackPressed(); } break; } } @Override public boolean onCreateOptionsMenu(Menu menu) { return true; } @Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); } @Override public void onBackPressed() { new Thread(new Runnable() { @Override public void run() { rtcEngine.leaveChannel(); } }).run(); // keep screen on - turned off getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); } public void onUpdateSessionStats(final IRtcEngineEventHandler.RtcStats stats) { runOnUiThread(new Runnable() { @Override public void run() { // bytes mByteCounts.setText(((stats.txBytes + stats.rxBytes - mLastTxBytes - mLastRxBytes) / 1024 / (stats.totalDuration - mLastDuration + 1)) + "KB/s"); // remember data from this call back mLastRxBytes = stats.rxBytes; mLastTxBytes = stats.txBytes; mLastDuration = stats.totalDuration; } }); } public synchronized void onFirstRemoteVideoDecoded(final int uid, int width, int height, final int elapsed) { log("onFirstRemoteVideoDecoded: uid: " + uid + ", width: " + width + ", height: " + height); runOnUiThread(new Runnable() { @Override public void run() { View remoteUserView = mRemoteUserContainer.findViewById(Math.abs(uid)); // ensure container is added if (remoteUserView == null) { LayoutInflater layoutInflater = getLayoutInflater(); View singleRemoteUser = layoutInflater.inflate(R.layout.viewlet_remote_user, null); singleRemoteUser.setId(Math.abs(uid)); TextView username = (TextView) singleRemoteUser.findViewById(R.id.remote_user_name); username.setText(String.valueOf(uid)); mRemoteUserContainer.addView(singleRemoteUser, new LinearLayout.LayoutParams(mRemoteUserViewWidth, mRemoteUserViewWidth)); remoteUserView = singleRemoteUser; } FrameLayout remoteVideoUser = (FrameLayout) remoteUserView.findViewById(R.id.viewlet_remote_video_user); remoteVideoUser.removeAllViews(); remoteVideoUser.setTag(uid); // ensure remote video view setup final SurfaceView remoteView = RtcEngine.CreateRendererView(getApplicationContext()); remoteVideoUser.addView(remoteView, new FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT, FrameLayout.LayoutParams.MATCH_PARENT)); remoteView.setZOrderOnTop(true); remoteView.setZOrderMediaOverlay(true); rtcEngine.enableVideo(); int successCode = rtcEngine.setupRemoteVideo(new VideoCanvas(remoteView, VideoCanvas.RENDER_MODE_ADAPTIVE, uid)); if (successCode < 0) { new android.os.Handler().postDelayed(new Runnable() { @Override public void run() { rtcEngine.setupRemoteVideo(new VideoCanvas(remoteView, VideoCanvas.RENDER_MODE_ADAPTIVE, uid)); remoteView.invalidate(); } }, 500); } if (remoteUserView != null && CALLING_TYPE_VIDEO == mCallingType) { remoteUserView.findViewById(R.id.remote_user_voice_container).setVisibility(View.GONE); } else { remoteUserView.findViewById(R.id.remote_user_voice_container).setVisibility(View.VISIBLE); } // app hints before you join TextView appNotification = (TextView) findViewById(R.id.app_notification); appNotification.setText(""); setRemoteUserViewVisibility(true); } }); } public synchronized void onUserJoined(final int uid, int elapsed) { log("onUserJoined: uid: " + uid); View existedUser = mRemoteUserContainer.findViewById(Math.abs(uid)); if (existedUser != null) { // user view already added return; } runOnUiThread(new Runnable() { @Override public void run() { // Handle the case onFirstRemoteVideoDecoded() is called before onUserJoined() View singleRemoteUser = mRemoteUserContainer.findViewById(Math.abs(uid)); if (singleRemoteUser != null) { return; } LayoutInflater layoutInflater = getLayoutInflater(); singleRemoteUser = layoutInflater.inflate(R.layout.viewlet_remote_user, null); singleRemoteUser.setId(Math.abs(uid)); TextView username = (TextView) singleRemoteUser.findViewById(R.id.remote_user_name); username.setText(String.valueOf(uid)); mRemoteUserContainer.addView(singleRemoteUser, new LinearLayout.LayoutParams(mRemoteUserViewWidth, mRemoteUserViewWidth)); // app hints before you join TextView appNotification = (TextView) findViewById(R.id.app_notification); appNotification.setText(""); setRemoteUserViewVisibility(true); } }); } public void onUserOffline(final int uid) { log("onUserOffline: uid: " + uid); if(isFinishing()){ return; } if(mRemoteUserContainer==null){ return; } runOnUiThread(new Runnable() { @Override public void run() { View userViewToRemove = mRemoteUserContainer.findViewById(Math.abs(uid)); mRemoteUserContainer.removeView(userViewToRemove); // no joined users any more if (mRemoteUserContainer.getChildCount() == 0) { setRemoteUserViewVisibility(false); TextView appNotification = (TextView) findViewById(R.id.app_notification); appNotification.setText(R.string.room_prepare); } } }); } @Override public void finish() { if(alertDialog!=null){ alertDialog.dismiss(); } super.finish(); } @Override public void onLeaveChannel(IRtcEngineEventHandler.RtcStats stats) { try { finish(); }catch (Exception e){ e.printStackTrace(); } } public void onUserMuteVideo(final int uid, final boolean muted) { log("onUserMuteVideo uid: " + uid + ", muted: " + muted); if(isFinishing()){ return; } if(mRemoteUserContainer==null){ return; } runOnUiThread(new Runnable() { @Override public void run() { View remoteView = mRemoteUserContainer.findViewById(Math.abs(uid)); remoteView.findViewById(R.id.remote_user_voice_container).setVisibility( (CALLING_TYPE_VOICE==mCallingType || (CALLING_TYPE_VIDEO==mCallingType && muted)) ? View.VISIBLE : View.GONE); remoteView.invalidate(); } }); } @Override public synchronized void onError(int err) { if(isFinishing()){ return; } // incorrect vendor key if(101==err){ runOnUiThread(new Runnable() { @Override public void run() { if(alertDialog!=null){ return; } alertDialog= new AlertDialog.Builder(ChannelActivity.this).setCancelable(false) .setMessage(getString(R.string.error_101)) .setPositiveButton(getString(R.string.error_confirm), new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { // Go to login Intent toLogin = new Intent(ChannelActivity.this, LoginActivity.class); toLogin.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); startActivity(toLogin); rtcEngine.leaveChannel(); } }).setOnCancelListener(new DialogInterface.OnCancelListener() { @Override public void onCancel(DialogInterface dialogInterface) { dialogInterface.dismiss(); } }) .create(); alertDialog.show(); } }); } // no network connection if (104 == err) { runOnUiThread(new Runnable() { @Override public void run() { TextView appNotification = (TextView) findViewById(R.id.app_notification); appNotification.setText(R.string.network_error); } }); } } public static String humanReadableByteCount(long bytes, boolean si) { int unit = si ? 1000 : 1024; if (bytes < unit) return bytes + " B"; int exp = (int) (Math.log(bytes) / Math.log(unit)); String pre = (si ? "kMGTPE" : "KMGTPE").charAt(exp - 1) + (si ? "" : "i"); return String.format("%.1f %sB", bytes / Math.pow(unit, exp), pre); } @Override protected void onDestroy() { super.onDestroy(); ((AgoraApplication) getApplication()).setEngineEventHandlerActivity(null); } } ================================================ FILE: AgoraDemo/src/main/java/io/agora/demo/agora/EntryActivity.java ================================================ package io.agora.demo.agora; import android.content.Intent; import android.content.res.Configuration; import android.os.Bundle; import android.os.Handler; import android.view.Window; /** * Launcher screen of app */ public class EntryActivity extends BaseActivity { @Override public void onCreate(Bundle savedInstanceState) { super.requestWindowFeature(Window.FEATURE_NO_TITLE); super.onCreate(savedInstanceState); setContentView(R.layout.activity_entry); enterAppWithDelay(2000); } @Override public void onConfigurationChanged(Configuration newConfig){ super.onConfigurationChanged(newConfig); } // move to login screen in delayInMillis private void enterAppWithDelay(long delayInMillis){ new Handler().postDelayed(new Runnable() { @Override public void run() { Intent intent=new Intent(EntryActivity.this,LoginActivity.class); startActivity(intent); finish(); } },delayInMillis); } } ================================================ FILE: AgoraDemo/src/main/java/io/agora/demo/agora/LoginActivity.java ================================================ package io.agora.demo.agora; import android.content.Context; import android.content.Intent; import android.content.res.Configuration; import android.os.AsyncTask; import android.os.Bundle; import android.text.TextUtils; import android.view.View; import android.view.Window; import android.widget.EditText; import android.widget.TextView; import android.widget.Toast; import org.apache.http.HttpResponse; import org.apache.http.HttpStatus; import org.apache.http.StatusLine; import org.apache.http.client.ClientProtocolException; import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpGet; import org.apache.http.impl.client.DefaultHttpClient; import java.io.ByteArrayOutputStream; import java.io.IOException; /** * Created by apple on 15/9/9. */ public class LoginActivity extends BaseActivity { private EditText mVendorKey; private EditText mChannelID; @Override public void onCreate(Bundle savedInstance) { super.requestWindowFeature(Window.FEATURE_NO_TITLE); super.onCreate(savedInstance); new RequestTask().execute("http://192.168.99.253:8970/agora.inner.test.key.txt"); // just update inner testing vendor key setContentView(R.layout.activity_login); initViews(); } private void initViews() { // bind listeners findViewById(R.id.action_video_calling).setOnClickListener(getViewClickListener()); findViewById(R.id.action_voice_calling).setOnClickListener(getViewClickListener()); this.mVendorKey = (EditText) findViewById(R.id.input_vendor_key); this.mChannelID = (EditText) findViewById(R.id.input_room_number); // please your own key, the test key is unavailable soon. this.mVendorKey.setText(getSharedPreferences(getClass().getName(), Context.MODE_PRIVATE).getString(ChannelActivity.EXTRA_VENDOR_KEY, "5a04ec409d984031bd0ebd417efd7f8f")); this.mChannelID.setText(getSharedPreferences(getClass().getName(), Context.MODE_PRIVATE).getString(ChannelActivity.EXTRA_CHANNEL_ID, "88888888")); } @Override public void onUserInteraction(View view) { // Ensure inputs are valid; if(!validateInput()){ return ; } switch (view.getId()) { default: super.onUserInteraction(view); // Voice calling case R.id.action_voice_calling: { Intent intent = new Intent(LoginActivity.this, ChannelActivity.class); intent.putExtra(ChannelActivity.EXTRA_CALLING_TYPE, ChannelActivity.CALLING_TYPE_VOICE); intent.putExtra(ChannelActivity.EXTRA_VENDOR_KEY, mVendorKey.getText().toString()); intent.putExtra(ChannelActivity.EXTRA_CHANNEL_ID, mChannelID.getText().toString()); startActivity(intent); // finish(); } break; // Video calling case R.id.action_video_calling: { Intent intent = new Intent(LoginActivity.this, ChannelActivity.class); intent.putExtra(ChannelActivity.EXTRA_CALLING_TYPE, ChannelActivity.CALLING_TYPE_VIDEO); intent.putExtra(ChannelActivity.EXTRA_VENDOR_KEY, mVendorKey.getText().toString()); intent.putExtra(ChannelActivity.EXTRA_CHANNEL_ID, mChannelID.getText().toString()); startActivity(intent); // finish(); } break; } // remember the vendor key and channel ID getSharedPreferences(getClass().getName(), Context.MODE_PRIVATE) .edit() .putString(ChannelActivity.EXTRA_VENDOR_KEY, mVendorKey.getText().toString()) .putString(ChannelActivity.EXTRA_CHANNEL_ID, mChannelID.getText().toString()) .apply(); } @Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); } boolean validateInput() { String vendorKey = mVendorKey.getText().toString(); String roomNumber = mChannelID.getText().toString(); // validate vendor key if (TextUtils.isEmpty(vendorKey)) { Toast.makeText(getApplicationContext(), R.string.key_required, Toast.LENGTH_SHORT).show(); return false; } // validate room number - cannot be empty if (TextUtils.isEmpty(roomNumber)) { Toast.makeText(getApplicationContext(), R.string.room_required, Toast.LENGTH_SHORT).show(); return false; } // validate room number - should be digits only if(!TextUtils.isDigitsOnly(roomNumber)){ Toast.makeText(getApplicationContext(), R.string.room_required, Toast.LENGTH_SHORT).show(); return false; } return true; } class RequestTask extends AsyncTask { String responseString = null; @Override protected String doInBackground(String... uri) { HttpClient httpclient = new DefaultHttpClient(); HttpResponse response; try { response = httpclient.execute(new HttpGet(uri[0])); StatusLine statusLine = response.getStatusLine(); if(statusLine != null && statusLine.getStatusCode() == HttpStatus.SC_OK){ ByteArrayOutputStream out = new ByteArrayOutputStream(); response.getEntity().writeTo(out); responseString = out.toString(); out.close(); } else{ //Closes the connection. response.getEntity().getContent().close(); throw new IOException(statusLine.getReasonPhrase()); } } catch (ClientProtocolException e) { //TODO Handle problems.. } catch (IOException e) { //TODO Handle problems.. } return responseString; } @Override protected void onPostExecute(String result) { super.onPostExecute(result); //Do anything with response.. if (responseString != null) { mVendorKey.setText(responseString.replaceAll("\\s+",""), TextView.BufferType.EDITABLE); } } } } ================================================ FILE: AgoraDemo/src/main/java/io/agora/demo/agora/MessageHandler.java ================================================ package io.agora.demo.agora; import io.agora.rtc.IRtcEngineEventHandler; /** * Created by apple on 15/9/10. */ public class MessageHandler extends IRtcEngineEventHandler { private BaseEngineEventHandlerActivity mHandlerActivity; //显示房间内其他用户的视频 @Override public void onFirstRemoteVideoDecoded(int uid, int width, int height, int elapsed) { BaseEngineEventHandlerActivity activity = getActivity(); if (activity != null) { activity.onFirstRemoteVideoDecoded(uid, width, height, elapsed); } } //用户进入 @Override public void onUserJoined(int uid, int elapsed){ BaseEngineEventHandlerActivity activity = getActivity(); if (activity != null) { activity.onUserJoined(uid, elapsed); } } //用户退出 @Override public void onUserOffline(int uid, int reason) { BaseEngineEventHandlerActivity activity = getActivity(); if (activity != null) { activity.onUserOffline(uid); } } //监听其他用户是否关闭视频 @Override public void onUserMuteVideo(int uid,boolean muted){ BaseEngineEventHandlerActivity activity = getActivity(); if (activity != null) { activity.onUserMuteVideo(uid, muted); } } //更新聊天数据 @Override public void onRtcStats(RtcStats stats){ BaseEngineEventHandlerActivity activity = getActivity(); if (activity != null) { activity.onUpdateSessionStats(stats); } } @Override public void onLeaveChannel(RtcStats stats) { BaseEngineEventHandlerActivity activity = getActivity(); if (activity != null) { activity.onLeaveChannel(stats); } } @Override public void onError(int err) { BaseEngineEventHandlerActivity activity = getActivity(); if (activity != null) { activity.onError(err); } } public void setActivity(BaseEngineEventHandlerActivity activity) { this.mHandlerActivity = activity; } public BaseEngineEventHandlerActivity getActivity(){ return mHandlerActivity; } } ================================================ FILE: AgoraDemo/src/main/java/io/agora/demo/agora/util/LoggingUtils.java ================================================ /*- * Authors : harry * * Created Date : Jun 13, 2013 * * Beauty Bond Inc. All rights reserved. * */ package io.agora.demo.agora.util; import android.util.Log; import io.agora.demo.agora.BuildConfig; /** * This util offers flexible logging for development of Android application. We * will need log information when the application is in working process. But it * is not recommended to provide log information when the application is * released. Thus the wrapper of Log will help. The principal is to offer a * switch to turn on and off and any time to control if the log information is * visible. */ public class LoggingUtils { public static void debug (String tag, String msg) { if (BuildConfig.DEBUG) { msg = msg == null ? "" : msg; Log.d(tag, msg); } } public static void error (String tag, String msg) { if (BuildConfig.DEBUG) { msg = msg == null ? "" : msg; Log.e(tag, msg); } } public static void warning (String tag, String msg) { if (BuildConfig.DEBUG) { msg = msg == null ? "" : msg; Log.w(tag, msg); } } } ================================================ FILE: AgoraDemo/src/main/java/io/agora/demo/agora/util/NetworkConnectivityUtils.java ================================================ /** * Created by harry on Nov 24, 2011 Copyright : FOCUSONE Inc. All Rights * Reserved. */ package io.agora.demo.agora.util; import android.content.Context; import android.net.ConnectivityManager; import android.net.NetworkInfo; import android.net.NetworkInfo.State; /** * This utils helps to do the following: 1) If device is connected to mobile * network 2) If device is connected to wifi 3) If device is connected, either * to mobile network or wifi. * * @author harry */ public class NetworkConnectivityUtils { /** * Log */ private static final String TAG = NetworkConnectivityUtils.class.getSimpleName (); public static boolean isConnectedToMobile (Context context) { ConnectivityManager conMan = (ConnectivityManager) context.getSystemService (Context.CONNECTIVITY_SERVICE); // mobile State mobile = conMan.getNetworkInfo (0).getState (); LoggingUtils.debug (TAG, "checking if device is connected to mobile network"); return mobile == State.CONNECTED; } public static boolean isConnectedToWifi (Context context) { ConnectivityManager conMan = (ConnectivityManager) context.getSystemService (Context.CONNECTIVITY_SERVICE); // wifi State wifi = conMan.getNetworkInfo (1).getState (); LoggingUtils.debug (TAG, "checking if device is connected to wifi"); return wifi == State.CONNECTED; } /** * This is a simple way to check if you are CONNECTED or is CONNECTING to * network. NOTE: you need to set * in your AndroidManifest.xml * * @param context a context used to getSystemInfo * @return */ public static boolean isConnectedToNetwork (Context context) { ConnectivityManager cm = (ConnectivityManager) context.getSystemService (Context.CONNECTIVITY_SERVICE); NetworkInfo netInfo = cm.getActiveNetworkInfo (); boolean isConnected = netInfo != null && netInfo.isConnected (); LoggingUtils.debug (TAG, "device is connected to network : " + isConnected); return isConnected; } private NetworkConnectivityUtils() { } } ================================================ FILE: AgoraDemo/src/main/res/drawable-xhdpi/button_selector_hung_up.xml ================================================ ================================================ FILE: AgoraDemo/src/main/res/drawable-xhdpi/go_micro_button_background.xml ================================================ ================================================ FILE: AgoraDemo/src/main/res/drawable-xhdpi/go_video_button_background.xml ================================================ ================================================ FILE: AgoraDemo/src/main/res/drawable-xhdpi/room_leave_button_background.xml ================================================ ================================================ FILE: AgoraDemo/src/main/res/drawable-xhdpi/shape_theme.xml ================================================ ================================================ FILE: AgoraDemo/src/main/res/drawable-xhdpi/shape_transparent.xml ================================================ ================================================ FILE: AgoraDemo/src/main/res/layout/actionbar.xml ================================================ ================================================ FILE: AgoraDemo/src/main/res/layout/activity_entry.xml ================================================ ================================================ FILE: AgoraDemo/src/main/res/layout/activity_login.xml ================================================ ================================================ FILE: AgoraDemo/src/main/res/layout/activity_room.xml ================================================