求微博头像和封面一张图游戏直播封面

五分钟看懂开发一个直播封面上传功能的过程
菜鸟窝技术文章编辑招募中,可免费学习优秀实战课程,有兴趣快加菜鸟君微信:keely-jzx。
直播封面上传功能运行效果
直播界面讲解
直播标题 当前直播的标题,内容简介直播封面 封面图片会在如上图显示以及直播列表上显示是否录制 直播结束之后需要观看直播,就需要录制,直播结束之后录制的视频文件就叫点播,可以对视频进行永久的存储摄像头直播 根据主播需求打开前置摄像头还是后置摄像头录屏直播 只要用于屏幕录播,例如:游戏 在5.0以上录制清晰度 码流和分辨率(流畅,超清,高清)决定
界面布局不贴了,读者自己看着界面做,这里需要提示一下,界面上用到的自定义控件在下期文章中有讲。
直播封面上传
直播封面上传功能有以下几个:
运行时权限验证
上传本地图片
上传相机图片
1、运行时权限验证
PublishPresenter # checkPublishPermission()
//1、权限通过 ActivityCompat 类的 checkSelfPermission() 方法判断是否有所需权限。//2、权限请求是通过 ActivityCompat 类中的 requestPermissions() 方法,在OnRequestPermissionsResultCallback # onRequestPermissionsResult() 方法中回调。//----------------------------split line---------------------------------------@Overridepublic boolean checkPublishPermission(Activity activity) { if(Build.VERSION.SDK_INT &= 23) { List&String& permissions = newArrayList&&(); //写入外部存储设备权限(保存封面图片)if(PackageManager.PERMISSION_GRANTED != ActivityCompat.checkSelfPermission(activity, android.Manifest.permission.WRITE_EXTERNAL_STORAGE)) { permissions.add(Manifest.permission.WRITE_EXTERNAL_STORAGE); } //相机权限if(PackageManager.PERMISSION_GRANTED != ActivityCompat.checkSelfPermission(activity, Manifest.permission.CAMERA)) { permissions.add(Manifest.permission.CAMERA); } //ActivityCompat.requestPermissions() 请求权限if(permissions.size() != 0) { ActivityCompat.requestPermissions(activity , permissions.toArray(newString[0]), Constants.WRITE_PERMISSION_REQ_CODE); returnfalse; } } returntrue;}
PublishActivity # onRequestPermissionsResult()
onRequestPermissionsResult() 处理请求权限
@Overridepublic void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults){ super.onRequestPermissionsResult(requestCode, permissions, grantResults); switch(requestCode) { //写入外部存储权限caseConstants.WRITE_PERMISSION_REQ_CODE: for(intret : grantResults) { if(ret != PackageManager.PERMISSION_GRANTED) { return; } } mPermission = true; break; }}
2、上传图片(相机、本地)
依然采用 MVP 架构。
【从 0 开始开发一款直播 APP】5.1 MVP 完全解析 — 实现直播登录
View — IPublishViewpublicinterfaceIPublishViewextendsBaseView{ Activity getActivity(); /** * 定位成功 * @param location 位置 */void doLocationSuccess(String location); /** * 定位失败 */void doLocationFailed(); /** * 图片上传成功 * @param url 路径 */void doUploadSuccess(String url); /** * 图片上传失败 * @param url 路径 */void doUploadFailed(String url); /** * 结束页面 */void finishActivity();}
Presenter — IPublishPresenterpublicabstractclass IPublishPresenter implements BasePresenter { protectedBaseView mBaseV public IPublishPresenter(BaseView baseView){ mBaseView = baseV } /** * 检查推流权限 * @param activity * @return */public abstract boolean checkPublishPermission(Activity activity); /** * 裁剪图片 * @param imgUri 图片地址 * @return */public abstract Uri cropImage(Uri imgUri); /** * 选择图片方式:相机、相册 * @param mPermission 权限 * @param type 类型 * @return */public abstract Uri pickImage(boolean mPermission,int type); /** * 上传图片 * @param path 图片路径 */public abstract void doUploadPic(String path);}
图片上传请求实体类
图片要上传到服务端,就需要请求网络,对图片上传封装一个请求实体。
publicclass UploadPicRequest extends IRequest { //http://live.demo.cniao5.com/Api/Image/upload//请求参数:userId type filepublic UploadPicRequest(int requestId, String userId, int type, File file)throws FileNotFoundException { mRequestId = requestId; mParams.put("userId",userId); mParams.put("type",type); mParams.put("file",file); } @Overridepublic String getUrl(){ returngetHost() + "Image/upload"; } @Overridepublic Type getParserType(){ returnnewTypeToken&Response&UploadResp&&() {}.getType(); }}
PublishPresenter 具体实现
图片裁剪请查看:详细解释如何通过Android自带的方式来实现图片的裁剪——原理分析+解决方案(http://www.cnblogs.com/tianzhijiexian/p/4059006.html)
publicclass PublishPresenter extends IPublishPresenter { privateIPublishView mIPublishV privatebooleanmUploading = false; privateString TAG = PublishPresenter.class.getSimpleName(); public PublishPresenter(IPublishView iPublishView){ super(iPublishView); this.mIPublishView = iPublishV } @Overridepublic void start(){ } @Overridepublic void finish(){ mIPublishView.finishActivity(); } /** * 直接调用系统的图片裁剪功能 * @param uri * @return */@Overridepublic Uri cropImage(Uri uri){ Uri cropUri = createCoverUri("_crop"); Intent intent = newIntent("com.android.camera.action.CROP"); intent.setDataAndType(uri, "image/*");//可以选择图片类型,如果是 * 表明所有类型的图片intent.putExtra("crop", "true");//设置在开启的Intent中设置显示的 view 可裁剪intent.putExtra("aspectX", 750);//裁剪图片的比例intent.putExtra("aspectY", 550); intent.putExtra("outputX", 750);//裁剪图片的宽intent.putExtra("outputY", 550); intent.putExtra("scale", true);//是否保持比例intent.putExtra("return-data", false);//是否返回bitmapintent.putExtra(MediaStore.EXTRA_OUTPUT, cropUri);//保存图片到指定uriintent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());//输出格式mIPublishView.getActivity().startActivityForResult(intent, Constants.CROP_CHOOSE);//启动裁剪功能returncropU } //存储封面图片并保存uri地址private Uri createCoverUri(String preFileName){ String filename = ImUserInfoMgr.getInstance().getUserId() + preFileName + ".jpg"; String path = Environment.getExternalStorageDirectory() + "/cniao_live"; File outputImage = newFile(path, filename); if(ContextCompat.checkSelfPermission(mIPublishView.getActivity(), Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(mIPublishView.getActivity(), newString[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, Constants.WRITE_PERMISSION_REQ_CODE); returnnull; } try{ File pathFile = newFile(path); if(!pathFile.exists()) pathFile.mkdirs(); if(outputImage.exists()) outputImage.delete(); } catch(Exception e) { e.printStackTrace(); mIPublishView.showMsg("生成封面失败"); } returnUri.fromFile(outputImage); } //选择封面图来源(相机、相册)@Overridepublic Uri pickImage(boolean mPermission, int type){ Uri fileUri = null; if(!mPermission) { mIPublishView.showMsg("权限不足"); returnnull; } switch(type) { //相机caseConstants.PICK_IMAGE_CAMERA: fileUri = createCoverUri(""); //启动相机Intent intent_photo = newIntent(MediaStore.ACTION_IMAGE_CAPTURE); intent_photo.putExtra(MediaStore.EXTRA_OUTPUT, fileUri); mIPublishView.getActivity().startActivityForResult(intent_photo, Constants.PICK_IMAGE_CAMERA); break; //本地相册caseConstants.PICK_IMAGE_LOCAL: fileUri = createCoverUri("_select"); //打开相册Intent intent_album = newIntent("android.intent.action.GET_CONTENT"); intent_album.setType("image/*"); mIPublishView.getActivity().startActivityForResult(intent_album, Constants.PICK_IMAGE_LOCAL); break; } returnfileU } //上传封面图@Overridepublic void doUploadPic(String path){ mUploading = true; try{ finalUploadPicRequest request = newUploadPicRequest(1000, ACache.get(mIPublishView.getContext()).getAsString("user_id"), Constants.LIVE_COVER_TYPE,newFile(path)); AsyncHttp.instance().post(request, newAsyncHttp.IHttpListener() { @Overridepublic void onStart(int requestId){ } @Overridepublic void onSuccess(int requestId, Response response){ if(response!=null) { UploadResp resp = (UploadResp) response.getData(); Log.i(TAG, "onSuccess url:"+ resp.getUrl()); mIPublishView.doUploadSuccess(resp.getUrl()); }else{ Log.i(TAG, "onSuccess url:"); } } @Overridepublic void onFailure(int requestId, int httpStatus, Throwable error){ Log.i(TAG, "onFailure :"+ error); mIPublishView.doLocationFailed(); } }); } catch(FileNotFoundException e) { e.printStackTrace(); } }}
封面图片上传实现
整个大致流程:首先检测权限,权限添加之后点击封面图片调用封面选择对话框,会出现三个按钮(相机、相册、取消)。
相机:打开相机功能进行拍照,然后确定之后会调用系统裁剪功能对图片进行裁剪,接着会将图片进行保存,裁剪之后再点击确定就会调用上传图片功能。
相册:打开相册选择,选择之后会调用系统裁剪功能对图片进行裁剪,接着会将图片进行保存,裁剪之后再点击确定就会调用上传图片功能。
取消:点击取消则退出当前对话框。
publicclass PublishActivity extends BaseActivity implements View.OnClickListener, IPublishView{ //图片封面文字privateTextView mTvPicT privateDialog mPicD//选择封面对话框(照相机、相册、取消)privateImageView mImgC//封面图privateUri mFileUri, mCropU//原始图片文件uri,裁剪之后的图片文件uriprivatebooleanmPermission = false;//权限监测privatePublishPresenter mPublishP privateString TAG = PublishActivity.class.getSimpleName(); @Overrideprotected void setActionBar(){ } @Overrideprotected void setListener(){ mImgCover.setOnClickListener(this); } @Overrideprotected void initData(){ //初始化PublishPresentermPublishPresenter = newPublishPresenter(this); //检测权限mPermission = mPublishPresenter.checkPublishPermission(this); String strCover = ACache.get(this).getAsString("head_pic"); if(!TextUtils.isEmpty(strCover)) { Log.e(TAG, "head_pic:"+ strCover); Glide.with(this).load(strCover).into(mImgCover); mTvPicTip.setVisibility(View.GONE); } else{ mImgCover.setImageResource(R.drawable.publish_background); } } @Overrideprotected void initView(){ mTvPicTip = obtainView(R.id.tv_pic_tip); mImgCover = obtainView(R.id.cover); //初始化图片选择对话框initPhotoDialog(); } /** * 封面图片选择对话框 */private void initPhotoDialog(){ //对话框初始化及样式设置mPicDialog = newDialog(this, R.style.float_dialog); //对话框布局mPicDialog.setContentView(R.layout.dialog_pic_choose); WindowManager windowManager = getWindowManager(); Display display = windowManager.getDefaultDisplay(); Window window = mPicDialog.getWindow(); WindowManager.LayoutParams lp = window.getAttributes(); window.setGravity(Gravity.BOTTOM); lp.width = display.getWidth(); mPicDialog.getWindow().setAttributes(lp); //按钮初始化并添加点击事件mPicDialog.findViewById(R.id.tv_chose_camera).setOnClickListener(this); mPicDialog.findViewById(R.id.tv_pic_lib).setOnClickListener(this); mPicDialog.findViewById(R.id.tv_dialog_cancel).setOnClickListener(this); } @Overrideprotected int getLayoutId(){ returnR.layout.activity_ } @Overridepublic void onClick(View v){ switch(v.getId()) { //封面图片选择caseR.id.cover: mPicDialog.show(); break; //相机,对拍摄图片地址进行存储,并对图片进行裁剪caseR.id.tv_chose_camera: mFileUri = mPublishPresenter.pickImage(mPermission, Constants.PICK_IMAGE_CAMERA); mPicDialog.dismiss(); break; //相册,从本地相册选择图片作为封面,并对图片进行裁剪,并将地址进行保存caseR.id.tv_pic_lib: mFileUri = mPublishPresenter.pickImage(mPermission, Constants.PICK_IMAGE_LOCAL); mPicDialog.dismiss(); break; //取消对话框按钮,表示不添加封面图片caseR.id.tv_dialog_cancel: mPicDialog.dismiss(); break; } } //相机和相册选择结果回调@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data){ if(resultCode == RESULT_OK) { switch(requestCode) { //选择相机图片caseConstants.PICK_IMAGE_CAMERA: mCropUri = mPublishPresenter.cropImage(mFileUri); Log.d(TAG, "cropImage-&path camera:"+ mCropUri.getPath()); Log.d(TAG,"PICK_IMAGE_CAMERA 选择相机图片成功"); break; //选择本地相册图片caseConstants.PICK_IMAGE_LOCAL: String path = OtherUtils.getPath(this, data.getData()); if(null!= path) { Log.d(TAG, "cropImage-&path local:"+ path); File file = newFile(path); mCropUri = mPublishPresenter.cropImage(Uri.fromFile(file)); } Log.e(TAG,"PICK_IMAGE_LOCAL 选择本地图片成功"); break; //上传相机/相册图片caseConstants.CROP_CHOOSE: mTvPicTip.setVisibility(View.GONE); Log.d(TAG, "cropImage-&path crop:"+ mCropUri.getPath()); mPublishPresenter.doUploadPic(mCropUri.getPath()); Log.d(TAG,"CROP_CHOOSE 上传图片成功"); break; } } } @Overridepublic void doUploadSuccess(String url){ //加载封面图Glide.with(this).load(url).into(mImgCover); } @Overridepublic void doUploadFailed(String url){ showMsg("直播封面上传失败"); } //其他某些实现方法已被删,代码量太大,只贴出主要代码//......}
在控制台可以查看到打印的 Log 信息,先选择图片,然后裁剪之后进行上传。上传到服务端会返回一个 url 地址。打开 url 可以在浏览器中查看到图片。
在手机上找到 cniao_live 文件夹,并且有刚刚上传过的图片。
作者:蒋志碧,免费试学《菜鸟直播》课程链接:http://www.cniao5.com/course/10121
直播”,进入“直播APP开发交流群”
责任编辑:
声明:该文观点仅代表作者本人,搜狐号系信息发布平台,搜狐仅提供信息存储空间服务。
今日搜狐热点拒绝访问 | steamcn.com | 百度云加速
请打开cookies.
此网站 (steamcn.com) 的管理员禁止了您的访问。原因是您的访问包含了非浏览器特征(439c2fca6afd43a1-ua98).
重新安装浏览器,或使用别的浏览器不知道大家看时第一眼能吸引你进直播间的点是什么,反正小编就是瞎翻,然后看到一个封面比较好看吸引人的就会点进去看看。所以说,一个好的直播封面是能吸引不少的用户的。那么在使用斗鱼直播时,我们该怎么设置封面呢?下面请看小编带来的方法。
设置方法:
斗鱼最早之前的封面是固定的,主播上传后房管审核后就可以了,自从06年改版以后封面就变成随机的了,系统每10分钟左右会自动截取你的直播画面做封面。
目前只有颜值版块可以自己设置封面,按要求拍好照片后进行提交,房管通过审核后就可以了。
以上就是关于设置画面的问题了,希望对大家有所帮助。
斗鱼直播热门教程
斗鱼直播热门教程
聊天交友|3.19MB
实时手机在线视频直播软件
聊天交友|28.43MB
一款最火爆的美女帅哥视频秀场应用
聊天交友|14.57MB
时随地和主播一起互动哦。
聊天交友|23.59MB
为你排忧解难的超火爆直播应用
聊天交友|8.29MB
主打劲歌辣舞的真人在线直播平台
角色扮演|1041.77MB
网易第一玄幻官方手游
角色扮演|354.33MB
有着超高自由度的古侠手游。
角色扮演|599.01MB
圆你自己的武侠梦!
关卡塔防|103.1MB
一款经典的策略塔防类手游王者荣耀优质主播直播间封面图申请
一、政策目的:为保证优质主播创造的高质量内容展现给更多用户观看。二、适用主播:①周均人气在10000以上男主播(周日至周六的平均值)②当周营收top40女主播(具体名单与女主播推荐政策一致,每周二更新,王者荣耀女主播推荐规则)三、政策说明:主播(及公会)可自行尝试策划用户喜欢的内容,例如冲击150连胜、7小时冲王者、新英雄玩法教学、COS直播等等富有创意而且观众喜欢的内容,虎牙官方将针对优质内容给予推荐资源支持。四、可申请推荐资源: 可申请资源:含Web端、APP端的主播直播间封面图五、申请要求①完整活动介绍:活动名称(宣传名称)、活动时间、活动文案(封面图用)、活动具体操作方案、参与主播名单及YY号等。活动方案模板下载地址:②直播画面要求:视频分辨率、视频码率:3000、视频帧率:30,直播画面整齐、无黑边,王者荣耀游戏内画质需调到高画质。③主播直播间标题明确标明活动名称;④推荐期间无任何商业广告。六、内容评审规则1.①每天有4个时间段可供主播选择,每个时间段最多推荐两名主播,封面图单次推荐时长不超过6小时。主播活动须在某一个时段内,不得跨时段。时段划分②每个主播在1个月内不得超过2次推荐。③如同一个活动跨度为两天,则视为2次推荐,主播当月不得再申请本项推荐。虎牙会优先挑选有创意的新内容,请各位主播积极创造新的内容(即短期内申请相同内容则优先级靠后)七、申请方法:(邮件申请)由主播或(公会OW)将活动策划方案以邮件形式发送至。邮件主题:XXX(主播昵称)策划活动封面图申请邮件内容:本次活动介绍、活动时间(细化到具体时间点,如13:30~15:30)、推荐主播昵称、推荐主播YY号、ow YY号(用于活动推荐安排沟通)邮件附件:活动策划方案(参照申请要求)、封面图设计文件(656*370 & 50K),如需官方设计请说明并附上设计素材及文案,官方设计须预留2个工作日。申请时间:至少提前3天发送申请邮件,申请邮件工作日及节假日都可发送,官方在收到邮件三个工作日内审核活动方案并回复邮件通知审核结果。注:如策划方案缺乏看点、可操作性不强或是涉嫌恶意抄袭、违规,官方有权不予支持或撤销推荐资源。虎牙直播王者荣耀运营团队
虎牙直播是国内领先的互动直播平台,每月超过千万的观众通过虎牙直播观看游戏直播。我们希望通过游戏链接自各地的游戏玩家,他们可以直播游戏、观看游戏、聊天。
微信公众号:HUYAZHIBO
手机扫描二维码或输入虎牙直播微信账号来添加关注。准备直播竞技类手游想求一张直播间的封面。_百度知道
准备直播竞技类手游想求一张直播间的封面。
我有更好的答案
我是竞技不是竞速
从发,你看你要哪个。
这个也不太好,但还是采纳你好了。
采纳率:14%
为您推荐:
其他类似问题
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。

我要回帖

更多关于 快手直播游戏怎么弄封面 的文章

 

随机推荐