持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第10天,点击查看活动详情
目录
Permission denied (maybe missing INTERNET permission) 错误解决
android.os.NetworkOnMainThreadException
增加网络请求权限
错误:
Permission denied (maybe missing INTERNET permission) 错误解决
<uses-permission android:name="android.permission.INTERNET" />
android.os.NetworkOnMainThreadException
if (android.os.Build.VERSION.SDK_INT > 9) {
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
}
添加依赖
报错:java.lang.Error:javax.xml.datatype.DatatypeConfigurationException:Provider org.apache.xerces.jaxp.datatype.DatatypeFactoryImpl
implementation 'xerces:xercesImpl:2.11.0'
添加包:
在git 里面找相应的工具包
编辑
添加jar
依赖 jar 地址:
GitHub - TencentCloud/tencentcloud-sdk-java: Tencent Cloud API 3.0 SDK for Java
生成公共类方法,静态
public static Float picCompareTencent(String ImageA,String ImageB,String UrlA,String UrlB) {
if (android.os.Build.VERSION.SDK_INT > 9) {
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
}
try{
// 实例化一个认证对象,入参需要传入腾讯云账户secretId,secretKey,此处还需注意密钥对的保密
// 密钥可前往https://console.cloud.tencent.com/cam/capi网站进行获取
Credential cred = new Credential("AKIDSk0Mo6Y8vXydNvJYmrmR4uLZcUO8KM1X", "Xza0FJO9jHk061kHH8pOn49HKk062rpd");
// 实例化一个http选项,可选的,没有特殊需求可以跳过
HttpProfile httpProfile = new HttpProfile();
httpProfile.setEndpoint("iai.tencentcloudapi.com");
// 实例化一个client选项,可选的,没有特殊需求可以跳过
ClientProfile clientProfile = new ClientProfile();
clientProfile.setHttpProfile(httpProfile);
// 实例化要请求产品的client对象,clientProfile是可选的
IaiClient client = new IaiClient(cred, "ap-beijing", clientProfile);
// 实例化一个请求对象,每个接口都会对应一个request对象
CompareFaceRequest req = new CompareFaceRequest();
req.setImageA(ImageA);
req.setImageB(ImageB);
req.setUrlA(UrlA);
req.setUrlB(UrlB);
// 返回的resp是一个CompareFaceResponse的实例,与请求对象对应
CompareFaceResponse resp = client.CompareFace(req);
// 输出json格式的字符串回包
System.out.println(CompareFaceResponse.toJsonString(resp));
return resp.getScore();
} catch (TencentCloudSDKException e) {
return null ;
}
}
Android文件系统管理— /storage/emulated/0/Android/data/{packgename}
/mnt/sdcard/Android/data/com.zhongxin.learninglibrary/cache/header_image
编辑
编辑
/data/data/com.zhongxin.learninglibrary
GSYVideoPlayer是什么
GSYVideoPlayer的功能有哪些,例如HTTPS,支持弹幕,外挂字幕,支持滤镜、水印、gif截图,片头广告,还有支持基本的拖动,声音、亮度调节,支持边播边缓存,支持视频自带rotation的旋转(90,270之类)等等等等,看着有点乱,还是让TJ君用表格的形式展现给大家吧:
| 功能类型 | 具体功能描述 |
|---|---|
| 缓存 | 边播边缓存,使用了AndroidVideoCache;ExoPlayer使用SimpleCache。 |
| 协议 | h263\4\5、Https、concat、rtsp、hls、rtmp、crypto、mpeg等等。(ijk模式格式支持) |
| 滤镜 | 简单滤镜(马赛克、黑白、色彩过滤、高斯、模糊、模糊等等20多种)、动画、(水印、画面多重播放等)。 |
| 帧图 | 视频第一帧、视频帧截图功能,视频生成gif功能。 |
| 播放 | 列表播放、列表连续播放、重力旋转与手动旋转、视频本身rotation旋转属性、快播和慢播、网络视频加载速度。 |
| 画面 | 调整显示比例:默认、16:9、4:3、填充;播放时旋转画面角度(0,90,180,270);镜像旋转。 |
| 内核 | IJKPlayer、EXOPlayer、MediaPlayer切换、自定义内核 |
| 布局 | 全屏与非全屏两套布局切换、没有任何操作控件的纯播放支持、弹幕功能、继承自定义任何布局。 |
| 播放 | 单例播放、多个同时播放、视频列表滑动自动播放、列表切换详情页面无缝播放。 |
| 窗口 | 小窗口、多窗体下(包括桌面)的小窗口播放。 |
| 广告 | 片头广告、跳过广告支持、中间插入广告功能。 |
| 字幕 | exo2模式下支持自定增加外挂字幕。 |
| dash | exo2 模式支持dash |
| 更多 | 暂停前后台切换不黑屏;调整不同清晰度的支持;无缝切换支持;锁定/解锁全屏点击功能;进度条小窗口预览(测试)。 |
| 自定义 | 可自定义渲染层、自定义管理层、自定义播放层(控制层)、自定义缓存层。 |
GSYVideoPlayer使用
implementation 'com.shuyu:GSYVideoPlayer:7.1.8'
<activity
android:name=".MpActivity"
android:configChanges="keyboard|keyboardHidden|orientation|screenSize|screenLayout|smallestScreenSize|uiMode"
android:screenOrientation="portrait" />
<com.shuyu.gsyvideoplayer.video.StandardGSYVideoPlayer
android:id="@+id/detail_player"
android:layout_width="match_parent"
android:layout_height="250dp"
/>
//加载视频
videoUrl = dataBean.getVideoUrl();
viewHolder.detail_player.setUpLazy(videoUrl, true, null, null, "哈哈哈");
//全屏动画
viewHolder.detail_player.setShowFullAnimation(true);
//设置返回键
viewHolder.detail_player.getBackButton().setVisibility(View.GONE);
//设置全屏按键功能
viewHolder.detail_player.getFullscreenButton().setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
viewHolder.detail_player.startWindowFullscreen(context, false, true);
}
});
//是否根据视频尺寸,自动选择竖屏全屏或者横屏全屏
viewHolder.detail_player.setAutoFullWithSize(true);
//防止错位设置
viewHolder.detail_player.setPlayTag(TAG);
viewHolder.detail_player.setPlayPosition(position);
//小屏时不触摸滑动
viewHolder.detail_player.setIsTouchWiget(false);
//点击跳转到视频作品
viewHolder.hot_line.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(context, VideosWordsActivity.class);
context.startActivity(intent);
}
});
GSYVideoPlayer禁用快进功能
继承StandardGSYVideoPlayer
package com.base.learning_zhongxin.video.videoplayer;
import android.content.Context;
import android.util.AttributeSet;
import android.widget.ImageView;
import com.base.learning_zhongxin.R;
import com.shuyu.gsyvideoplayer.video.StandardGSYVideoPlayer;
public class FullGSYVideoPlayer extends StandardGSYVideoPlayer {
public FullGSYVideoPlayer(Context context, Boolean fullFlag) {
super(context, fullFlag);
}
public FullGSYVideoPlayer(Context context) {
super(context);
}
public FullGSYVideoPlayer(Context context, AttributeSet attrs) {
super(context, attrs);
}
public onGetState getState;
@Override
public int getLayoutId() {
return R.layout.video_header_layout;
}
@Override
protected void updateStartImage() {
if (mStartButton instanceof ImageView) {
ImageView imageView = (ImageView) mStartButton;
if (mCurrentState == CURRENT_STATE_PLAYING) {
imageView.setImageResource(R.drawable.video_click_pause_selector);
} else if (mCurrentState == CURRENT_STATE_ERROR) {
imageView.setImageResource(R.drawable.video_click_play_selector);
} else {
imageView.setImageResource(R.drawable.video_click_play_selector);
}
}
}
@Override
protected void init(Context context) {
super.init(context);
//第一个true是否需要隐藏actionbar,第二个true是否需要隐藏statusbar
// startWindowFullscreen(context, true, true);
}
@Override
protected void setStateAndUi(int state) {
super.setStateAndUi(state);
if (getState != null){
getState.getStateAndUi(state);
}
}
public interface onGetState{
void getStateAndUi(int state);
}
}
重写布局
编辑
<?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:background="@android:color/black">
<RelativeLayout
android:id="@+id/surface_container"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center">
</RelativeLayout>
<RelativeLayout
android:id="@+id/thumb"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_alignParentBottom="true"
android:layout_alignParentEnd="true"
android:layout_alignParentLeft="true"
android:layout_alignParentRight="true"
android:layout_alignParentStart="true"
android:layout_alignParentTop="true"
android:background="#000000"
android:scaleType="fitCenter" />
<LinearLayout
android:id="@+id/layout_bottom"
android:layout_width="match_parent"
android:layout_height="@dimen/size_big_40"
android:layout_alignParentBottom="true"
android:background="#99000000"
android:gravity="center_vertical"
android:orientation="horizontal"
android:visibility="invisible">
<TextView
android:id="@+id/current"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="@dimen/size_nomal_16"
android:text="00:00"
android:textSize="@dimen/text_size_small_12"
android:textColor="#ffffff" />
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_weight="1.0"></TextView>
<SeekBar
android:visibility="gone"
android:id="@+id/progress"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_weight="1.0"
android:background="@null"
android:max="100"
android:maxHeight="@dimen/size_small_4"
android:minHeight="@dimen/size_small_4"
android:paddingBottom="@dimen/size_small_8"
android:paddingTop="@dimen/size_small_8"
android:progressDrawable="@drawable/video_seebar_progress_layer"
android:thumb="@drawable/video_seekbar_thumb_layer" />
<TextView
android:id="@+id/total"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginRight="@dimen/size_nomal_16"
android:textSize="@dimen/text_size_small_12"
android:text="00:00"
android:textColor="#ffffff" />
<ImageView
android:id="@+id/fullscreen"
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:paddingRight="@dimen/size_nomal_16"
android:scaleType="center"
android:src="@drawable/full_screen_icon" />
</LinearLayout>
<ProgressBar
android:id="@+id/bottom_progressbar"
style="?android:attr/progressBarStyleHorizontal"
android:layout_width="match_parent"
android:layout_height="1.5dp"
android:layout_alignParentBottom="true"
android:max="100"
android:progressDrawable="@drawable/video_progress" />
<ImageView
android:id="@+id/back_tiny"
android:layout_width="24dp"
android:layout_height="24dp"
android:layout_marginLeft="6dp"
android:layout_marginTop="6dp"
android:visibility="gone" />
<ProgressBar
android:id="@+id/loading"
style="?android:attr/progressBarStyleLarge"
android:layout_width="28dp"
android:layout_height="28dp"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:visibility="invisible" />
<ImageView
android:id="@+id/start"
android:layout_width="@dimen/size_big_40"
android:layout_height="@dimen/size_big_40"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:layout_gravity="center_vertical"
android:src="@drawable/video_click_play_selector" />
<ImageView
android:id="@+id/small_close"
android:layout_width="30dp"
android:layout_height="30dp"
android:paddingLeft="10dp"
android:paddingTop="10dp"
android:scaleType="centerInside"
android:src="@drawable/video_small_close"
android:visibility="gone" />
<LinearLayout
android:id="@+id/layout_top"
android:layout_width="match_parent"
android:layout_height="48dp"
android:layout_alignParentTop="true"
android:layout_toEndOf="@+id/back_tiny"
android:layout_toRightOf="@+id/back_tiny"
android:background="@drawable/video_title_bg"
android:gravity="center_vertical">
<ImageView
android:id="@+id/back"
android:layout_width="48dp"
android:layout_height="48dp"
android:paddingLeft="10dp"
android:scaleType="centerInside"
android:src="@drawable/video_back" />
<TextView
android:id="@+id/title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:paddingLeft="10dp"
android:textColor="@android:color/white"
android:textSize="18sp" />
</LinearLayout>
</RelativeLayout>