前言
手机视频直播系统在互联网领域的受欢迎程度一直居高不下,直播已经成为当下最流行的一种娱乐消遣方式。直播系统也从之前的pc转到现在的手机APP,目前市面上人们使用的手机系统分为两个,即Android端和iOS端。今天来给大家分享一下关于Android端上传图片方面的相关内容。 Android端上传图片功能,即调用系统相册和拍照上传直播封面和头像,需要适配各种机型和不同系统版本,以下为此过程中遇到的具体问题及其相应的解决方案。
1.为了适配不同系统版本,调用相册和拍照时分别对系统版本号进行判断,做不同的处理。如下
//打开相册,选择文件
if (Build.VERSION.SDK_INT < 19) {
intent.setAction(Intent.ACTION_GET_CONTENT);
} else {
intent.setAction(Intent.ACTION_OPEN_DOCUMENT);
}
//开启摄像头,执行拍照
Uri uri = null;
if (Build.VERSION.SDK_INT >= 24) {
uri = FileProvider.getUriForFile(mContext, WordUtil.getString(R.string.FILE_PROVIDER), mCameraResult);
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
} else {
uri = Uri.fromFile(mCameraResult);
}
2.为了解决7.0系统对目录访问的限制的问题,所以用到了FileProvider,需要在AndroidManifest.xml中增加provider节点,在xml文件夹中创建file_paths.xml文件
<!--Android 7.0 拍照-->
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="com.yunbao.phonelive.fileprovider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths"/>
</provider>
3.为了解决,许多机型在选择相册和拍照后的裁剪时出现的SecurityException问题,首先在gradle中添加依赖 ,用UCrop去做Intent跳转,可设置图片裁剪比例和宽高,选择相册图片后的裁剪代码如下
/**
* 选择后裁剪
*/
private void cropAfterChoose(Uri uri) {
mCorpResult = getNewFile();
try{
Uri resultUri = Uri.fromFile(mCorpResult);
if (resultUri == null || mFragment == null || mContext == null) {
return;
}
UCrop uCrop = UCrop.of(uri, resultUri)
.withAspectRatio(1, 1)
.withMaxResultSize(400, 400);
Intent intent = uCrop.getIntent(mContext);
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
startActivityForResult(intent, mCropResultCallback);
}catch (Exception e){
try {
Uri resultUri = null;
if (Build.VERSION.SDK_INT >= 24) {
resultUri = FileProvider.getUriForFile(mContext, WordUtil.getString(R.string.FILE_PROVIDER), mCorpResult);
}
if (resultUri == null || mFragment == null || mContext == null) {
return;
}
UCrop uCrop = UCrop.of(uri, resultUri)
.withAspectRatio(1, 1)
.withMaxResultSize(400, 400);
Intent intent = uCrop.getIntent(mContext);
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
startActivityForResult(intent, mCropResultCallback);
}catch (Exception e1){
e1.printStackTrace();
}
}
}