安卓 日常问题 工作日志18

今天 学习 android多线程  atomininteger内存模型  以及自己项目的 视频播放功能

目前 对于android一些知识点 大家可以 去看今日头条的 android进阶小刘  这个博主 讲得很好

atomininteger内存模型 是啥

https://blog.csdn.net/fanrenxiang/article/details/80623884  没看懂

https://www.cnblogs.com/nightOfStreet/articles/11887169.html

好這裏说下我的視頻播放項目

我主要使用 videoView 去进行视频播放

xml

<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:background="@android:color/black"    android:id="@+id/root_ll"><!--    视频播放-->    <VideoView        android:id="@+id/videoPlayView"        android:layout_width="match_parent"        android:layout_height="450dp"        android:layout_marginBottom="14dp"        android:layout_marginLeft="12dp"        android:layout_marginRight="12dp"        android:layout_marginTop="15dp"        />    <ImageButton        android:id="@+id/ibBack"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_margin="?android:listPreferredItemPaddingStart"        android:background="@android:color/transparent"        android:src="@drawable/ib_knight_return" />

</RelativeLayout>

xml文件很简单 主要是   VideoView的布局 去实现播放器的功能

activity代码           其实代码很简单 videoview的视频播放+缩略图背景    使用缩略图设置背景  然后在 加载完视频数据后 隐藏背景进行播放

package com.zsch.forestinventory.activity.left_activity;

import android.graphics.Bitmap;import android.graphics.Color;import android.graphics.drawable.BitmapDrawable;import android.media.MediaMetadataRetriever;import android.media.MediaPlayer;import android.net.Uri;import android.os.Build;import android.os.Bundle;import android.os.Message;import android.view.MotionEvent;import android.view.View;import android.widget.ImageButton;import android.widget.ImageView;import android.widget.MediaController;import android.widget.Toast;import android.widget.VideoView;import android.support.annotation.Nullable;import com.zsch.androidlib.activity.BaseActivity;import com.zsch.forestinventory.BuildConfig;import com.zsch.forestinventory.R;import com.zsch.forestinventory.ui.overlay.controller.MeasureController;

import java.io.IOException;import java.util.HashMap;import android.os.Handler;import android.util.Log;/** * 播放视频 */public class ShowVideoViewActivity extends BaseActivity implements View.OnClickListener {

    private ImageButton ibBack;    private Uri uri;  /其他页面传过来的 uri对象 

    private MediaController mc; //视频播放控制器     private int bufferPercentage = 0;    private VideoView videoView;    private ImageView first_frame;

    @Override    protected void initVariables() {        uri = getIntent().getData();        if (uri == null)            finish();

    }

    @Override    protected void initView(Bundle savedInstanceState) {        setContentView(R.layout.activity_show_video_view);

        if (savedInstanceState == null) {           // Bundle类型的数据与Map类型的数据相似,都是以key-value的形式存储数据的。实际上,savedInstanceState也就是保存Activity的状态的            //onsaveInstanceState方法是用来保存Activity的状态的。当一个Activity在生命周期结束前,会调用该方法保存状态           // 用来保存状态信息的Bundle会同时传给两个method,即onRestoreInstanceState() and onCreate().            uri = getIntent().getData();        } else {            uri = savedInstanceState.getParcelable("uri");        }        if (uri == null) {            Toast.makeText(this, "无视频展示", Toast.LENGTH_SHORT).show();            finish();            return;        }

        videoView = (VideoView) findViewById(R.id.videoPlayView);        ibBack=(ImageButton) findViewById(R.id.ibBack);        ibBack.setOnClickListener(this);        mc = new MediaController(this);        videoView.setMediaController(mc);      //设置视频控制器,组件可以控制视频的播放,暂停,快进,组件,不需要你实现        videoView.setVideoURI(uri);//设置视频的播放地址 加载uri所对应的视频         String  videoUrl=uri.getPath();        Bitmap bitmapfirst_frame=getBitmapFormUrl(videoUrl); //生成缩略图        videoView.setBackgroundDrawable(new BitmapDrawable(getResources(), bitmapfirst_frame));

        //解決 黑屏方法   这里最重要 因为在视频家在之前 就是 prepared前 会显示为黑屏 用以下方法解决         //先在videoView設置背景 利用 本地視頻 制作缩略图        //等到视频真正开始渲染后再去掉VideoView 的背景。最终的解决办法是在onPrepared回调中,加添加一个setOnInfoListener的监听,在这个监听中将VideoView的背景清除        videoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {  //setOnPreparedListener 用于处理准备结束后的操作
            @Override            public void onPrepared(MediaPlayer mp) {// 装载完毕回调 时的方法  OnPreparedListener里的ononPrepared方法
                mp.setOnInfoListener(new MediaPlayer.OnInfoListener() {                    @Override                    public boolean onInfo(MediaPlayer mp, int what, int extra) {                        if (what == MediaPlayer.MEDIA_INFO_VIDEO_RENDERING_START)                           // first_frame.setVisibility(View.GONE); //组件看不到,不占用布局空间                          //  videoView.setVisibility(View.VISIBLE); //组件可见 并占用空间                           videoView.setBackgroundColor(Color.TRANSPARENT); //将VideoView的背景清除  将背景颜色 设置为空                        return true;                    }                });

            }        });

    }

   // 生成視頻 首帧 缩略图    public static Bitmap getBitmapFormUrl(String url) {        Bitmap bitmap = null;        MediaMetadataRetriever retriever = new MediaMetadataRetriever();        try {            retriever.setDataSource(url); //因为是本地视频 不考虑 sdk 版本 问题    网络 流媒体 考虑 全部//            if (Build.VERSION.SDK_INT >= 14) {//                retriever.setDataSource(url, new HashMap<String, String>());//            } else {//                retriever.setDataSource(url);//            }        /*getFrameAtTime()--->在setDataSource()之后调用此方法。 如果可能,该方法在任何时间位置找到代表性的帧,         并将其作为位图返回。这对于生成输入数据源的缩略图很有用。**/            bitmap = retriever.getFrameAtTime();        } catch (IllegalArgumentException e) {            e.printStackTrace();        } finally {            try {                retriever.release();            } catch (IllegalArgumentException e) {                e.printStackTrace();            }        }        return bitmap;    }

    @Override    protected void onResume() {        super.onResume();//        try {//            Toast.makeText(ShowVideoActivity.this, "1", Toast.LENGTH_LONG).show();//            mediaPlayer.setDataSource(uri.getPath());   //播放存储设备的资源文件//            mediaPlayer.setOnBufferingUpdateListener(this); //监听事件,网络流媒体的缓冲监听。这个方法与上个接口中的方法int getBufferPercentage()进行结合使用//            //mediaPlayer.prepare();//            controller.setMediaPlayer(this);//            controller.setEnabled(true);  //设置按钮可点击   false 设置为不可点击//        }catch (IOException e){//            e.printStackTrace();//        }

    }

    @Override    protected void loadData() {

    }

    @Override    public void onClick(View view) {        switch (view.getId()) {            case R.id.ibBack:               onBackPressed();                break;        }    }

    @Override    public void onBackPressed() {        finish();     //    finish();//在Activity中执行this.finish()方法之后,执行如下过程: onPause(),onStop(),onDestory(),    }

    @Override    public boolean onTouchEvent(MotionEvent event) {  //实现这个方法来处理触摸屏幕引发的事件。        return super.onTouchEvent(event);    }

}

原文地址:https://www.cnblogs.com/dushutai/p/12658741.html

时间: 2024-11-09 02:05:27

安卓 日常问题 工作日志18的相关文章

安卓 日常问题 工作日志

安卓中 常用的 权限   AndroidManifest.xml文件中 首先 我建议大家 有机会 还是优先去考虑 大厂 去实习或者 找到 自己的第一份工作 以为 大厂你会接触到 当前比较流行的 框架 插件 编程是越来越简单 越来越 容易理解的 老东西会被淘汰 当然 原理我们一定要懂 有机会 要看下 源码 去理解源码 <uses-permission android:name="android.permission.INTERNET" /> <!-- 获取sd卡写的权限

安卓 日常问题 工作日志23

谈一谈安卓的相对布局 之前只会使用·线性布局 所以要多学一个 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="fill_parent" android:layout_height="f

安卓 日常问题 工作日志6

adapter 用自己定义的 image 讲解 package com.zsch.forestinventory.adapter; import android.content.Context;import android.net.Uri;import android.support.v7.widget.RecyclerView;import android.util.Log;import android.view.LayoutInflater;import android.view.View;

安卓 日常问题 工作日志10

android 拍摄视频 拍摄照片的 流程    https://www.cnblogs.com/younghao/p/5089118.html,https://www.jianshu.com/p/e5312fd916dd?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation 代码 package com.zsch.forestinventory.activity

工作日志2014-07-02

星期三 6:30起床 7:30坐上车 8:00开始往大连走 8:50到七贤岭30元 12:00吃饭8元 18:00等车 19:30到校25元 20:00吃晚饭8.5元 工作时间: 百度云推送(结合官网的Demo和文档,有一点了解) 问潘美德有关文档的问题,但是没有很好解决 今天支出71.5元 工作日志2014-07-02,布布扣,bubuko.com

cocos2d-x学习日志(18) --程序是如何开始运行与结束?

问题的由来 怎么样使用 Cocos2d-x 快速开发游戏,方法很简单,你可以看看其自带的例程,或者从网上搜索教程,运行起第一个HelloWorld,然后在 HelloWorld 里面写相关逻辑代码,添加我们的层.精灵等 ~ 我们并不一定需要知道 Cocos2d-x 是如何运行或者在各种平台之上运行,也不用知道 Cocos2d-x 的游戏是如何运行起来的,它又是如何渲染界面的 ~~~ 两个入口 程序入口的概念是相对的,AppDelegate 作为跨平台程序入口,在这之上做了另一层的封装,封装了不同

工作日志2014-07-03

星期四 7:00起床 8:30到七贤岭30元 8:50吃完饭3元 12:00吃饭8元 18:00下班 工作时间: 百度云推送[潘美德已经没让我管太多] LeftMenuViewController的UI调整 工作日志2014-07-03

将datagrid中数据导出到excel中 -------&lt;&lt;工作日志2014-6-6&gt;&gt;

1.下载log4j jar包,放入lib目录, 导入项目中   下载地址 http://logging.apache.org/ 2.创建log4j.properties 文件  目录 Src  下面是一个 log4j.properties的例子(注:来源于网上,非本人所写) ################################################################################ # 其语法:log4j.rootLogger = [ leve

点晴OA的工作日志、工作报告、工作计划强强联手提高效率

一个企业看他能不能在众多的同行中脱颖而出,关键是需要看他是如果管理好他的员工,如何清楚的知道他们的员工每天做什么工作,而且帮助他们解决问题和提高工作效率. 我们就说一下一个比较实际的能够提高工作效率的点晴OA功能模块:工作日志.工作报告和工作计划. 工作日志:用于员工每天记录工作内容的管理.在点晴OA系统的工作日志中,直属领导可以事先为下属设计相关的工作日志模版,然后员工每天按照工作日志模版的内容进行工作反馈.企业主管.部门主管的一项重要工作就是全面地阅读员工工作日志,老板的一项重要工作也是抽样