之前实验室有很多展示的设备,每次上电之后还需要单个点击打开每个展示设备开发好的APP,因为每个设备没有触屏,需要抱着电脑去实验室 挨个连接USB 使用scrcpy 挨个机器点开,每次搞完都是一身汗,作为一个程序员去过一次之后就不想去了,而且还经常有领导视察,来回断电上点太频繁,索性开发一款开机自启动的APP就可以省去好多时间,只需要管理实验室的人每次上电就行了,不需要我每次报个电脑去实验室了,这样岂不是大大节省了人力和时间成本啊,经过一番努力终于搞好了,先把设计思路分享一下,避免大家重复造轮子。

因为是一款简单的开机自启动,未使用任何第三方框架,代码也非常的简单,在此处也做一下笔记。

大致动能包括

1.开机自启动。

2.便利制定目录下的视频和音频文件。

3.视频和图片同时存在的情况下优先播放视频。

4.权限申请

下面分个讲解

1.开机自启动。

监听开启自启动广播,在AndroidManif.xml 添加如下权限

 <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />

注册静态广播

        <receiverandroid:name=".RebootBroadCastReceiver"android:directBootAware="true"android:enabled="true"android:exported="true"><intent-filter><action android:name="android.intent.action.BOOT_COMPLETED"></action></intent-filter></receiver>
RebootBroadCastReceiver.java
public class RebootBroadCastReceiver extends BroadcastReceiver {static final String action_boot="android.intent.action.BOOT_COMPLETED";@Overridepublic void onReceive(Context context, Intent intent) {if (intent.getAction().equals(action_boot)){Intent bootMainIntent = new Intent(context, MainActivity.class);//FLAG_ACTIVITY_NEW_TASK 不添加不能启动ActivitybootMainIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);context.startActivity(bootMainIntent);}}
}

2.便利制定目录下的视频和音频文件。

设置基础查询路径

File baseFile = new File(takePicRootDir(this));

查询外置DICM文件夹,如果外置没有查询内置DICM

   /*** 获取需要查询的文件夹*/public String takePicRootDir(Context context) {if (checkSDCardAvailable()) {return Environment.getExternalStorageDirectory() + File.separator + "DCIM" + File.separator;} else {return context.getFilesDir().getAbsolutePath() + File.separator + "DCIM" + File.separator;}}
   /*** 判断当前存储卡是否可用*/public boolean checkSDCardAvailable() {return Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED);}

视频过滤条件固文件夹下面的文

public static final String[] VIDEO_EXTENSIONS = {"3gp", "mp4","avi",  "mov", "movie"};

便利文件视频过滤器

  /*** 视频过滤器*/FileFilter videoFilenameFilter = new FileFilter() {@Overridepublic boolean accept(File file) {if (file.isDirectory()) {return true;}String s = file.getName();String apkName = s.substring(s.lastIndexOf(".") + 1);return Arrays.asList(VIDEO_EXTENSIONS).contains(apkName);}};

图片过滤器,指定格式 ,因DICM文件夹存在  .(点开头的文件或文件夹对用户不可见) thumbnails文件夹会导致便利出来的图片是缩略图因此碰到thumbnails不进行 遍历。

   /*** 照片过滤器*/FileFilter imageFilenameFilter = new FileFilter() {@Overridepublic boolean accept(File file) {if (file.isDirectory()) {return true;}// 测试发现有不清楚的图片 原因是 thumbnails存在缩略图,剔除掉缩略图图片if (file.getAbsolutePath().contains("thumbnails")){return false;}String s = file.getName();return s.toLowerCase().endsWith("jpeg")| s.endsWith("jpg")| s.endsWith("png");}};

文件遍历的具体实现,并将文件文件路径存到集合当中并且返回。

    /*** 描述:  获取DCIM文件夹下的所有的 图片 以及 视频列表*/private static ArrayList<String> filePath(File file, FileFilter filenameFilter) {ArrayList<String> list = new ArrayList<String>();File[] files = file.listFiles(filenameFilter);if (files == null) {return null;}for (File f : files) {if (f.isDirectory()) {list.addAll(filePath(f, filenameFilter));} else {list.add(f.getAbsolutePath());}}return list;}

3.视频和图片同时存在的情况下优先播放视频。

这个逻辑可以根据自己的想法,可以比较集合,如果视频集合不为空就只播放视频集合,若视频集合为空播放图片

播放视频直接使用 VideoView 会出现 视频播放有黑边不全屏的问题

需要自定义 VideoView 为CustomVideoView.java 代码如下 ,需要将播放的视频内容设置成同样的宽高

public class CustomVideoView extends VideoView {public CustomVideoView(Context context) {super(context);}public CustomVideoView(Context context, AttributeSet attrs) {super(context, attrs);}public CustomVideoView(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);}@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {// 获取控件的宽高,将视频设置成同样宽高int width = getDefaultSize(0, widthMeasureSpec);int height = getDefaultSize(0, heightMeasureSpec);setMeasuredDimension(width, height);}@Overridepublic void setOnPreparedListener(MediaPlayer.OnPreparedListener l) {super.setOnPreparedListener(l);}@Overridepublic boolean onKeyDown(int keyCode, KeyEvent event) {return super.onKeyDown(keyCode, event);}
}

 

4.权限申请

如果有系统签名的话,尽量使用系统签名,这样就不用在进行权限动态申请了,如果没有系统签名,第一次安装还要点击一下动态申请权限的用户确定

AndroidManifest.xml

    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

因为只需要读取,所以只写了读权限,具体的代码如下:

private static int REQUEST_PERMISSION_CODE = 1;//读权限
private static String[] PERMISSIONS_STORAGE = {Manifest.permission.READ_EXTERNAL_STORAGE};

判断是否有权限,没权限申请弹窗

 @Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);...省略代码...if (Build.VERSION.SDK_INT > Build.VERSION_CODES.LOLLIPOP) {if (ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {ActivityCompat.requestPermissions(this, PERMISSIONS_STORAGE, REQUEST_PERMISSION_CODE);return;}}...执行有权限的逻辑...}

用户点击权限申请之后,判断结果进行处理

    /*** 用户点击权限后的回调* @param requestCode* @param permissions* @param grantResults*/@Overridepublic void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {super.onRequestPermissionsResult(requestCode, permissions, grantResults);if (requestCode == REQUEST_PERMISSION_CODE) {if (grantResults[0] == 0) {...执行有权限的逻辑...}}}

 项目地址

Android开机自启自动轮播图片或自动轮播视频APP相关推荐

  1. Android开机自启监听网络改变源码

    先看下主页面代码 mainactivity.java package cn.xiayiye.networkchange;import android.app.Activity; import andr ...

  2. android开机自启

    1.监控RECEIVE_BOOT_COMPLETED,即开机自启动事件AndroidManifest.xml 设置开机启动权限以及相应的receiver 2.监控sd卡的mount事件,开机的时候一般 ...

  3. android开机自启广播无效果的曲线解决方案

    AndroidManifest.xml <?xml version="1.0" encoding="utf-8"?><manifest xml ...

  4. Android:Android开机动画

    Android系统的开机画面显示过程分析 三个开机画面修改方式:目录 DIY固件系列教程--实现开机LOGO三屏动画的完全替换 一.第一个开机画面是在内核启动的过程中出现的,它是一个静态的画面 二.第 ...

  5. 滑动轮播_这样运营轮播图可以增加订单

    我们都说脸面代表个人名片,那么在小程序中,轮播图就是店铺的脸面,当我们打开网站.APP.小程序等应用的首页,首先映入眼帘的就是轮播图.那么作为店铺脸面的轮播图有什么作用呢?本周我们一起来看看. 轮播图 ...

  6. Android之ViewPager实现图片无限循环轮播

    很久没有写博客了,之前花时间写了一个Viewpager实现的无限图片轮播,个人感觉还是很好用的QAQ,源码和思路都还算清晰 实现的效果图如下: 这里要补充一下,在这个项目中我把图片轮播写进了一个Vie ...

  7. Android广告条效果--使用Volley实现网络图片的自动轮播(仿淘宝、网易广告页轮播效果)

    最近在做自定义控件时,发现一个极其常用的效果--广告条,即图片的自动轮播效果.现在市面上大多数的APP软件都在使用这种展示广告的效果.闲来无事,我简单翻看了一下自己的手机软件,几乎都使用了这种图片自动 ...

  8. Android 使用ViewPager 做的半吊子的图片轮播

    Android 使用ViewPager 做的半吊子的图片轮播 效果图 虽然不咋样,但是最起码的功能是实现了,下面我们来一步步的实现它. 界面 下面我们来分析一下界面的构成 整体的布局: 因为我们要做出 ...

  9. Android 应用开机自启和无需权限开启悬浮框

    开机自启主要自定义广播接收类,且需要在清单文件中注册,不要在代码中动态注册. <uses-permission android:name="android.permission.REC ...

最新文章

  1. 打造精简版Linux-mini
  2. Zookeeper客户端
  3. android 动态修改菜单,如何在Android的“选项”菜单上更改MenuItem?
  4. (计算机组成原理)第二章数据的表示和运算-第一节5:本章习题
  5. Vijos1240 朴素的网络游戏
  6. TIOBE 7月编程语言排行:各大城市程序员的工资状况又又又涨了
  7. [转载] Java并发编程:Callable、Future和FutureTask
  8. 聚类-----高斯混合模型
  9. sitemesh应用
  10. 2018百度seo最新算法大全 青岛墨羽SEO统计
  11. 【HNOI2015】落忆枫音
  12. 北京航空航天大学夏令营机试题
  13. 客户分级管理的意义和方法?如何高效的对客户进行分级?
  14. 百度地图在设置中心时,背景变白
  15. Windows和iPad传输
  16. python nltk语义分析_Python nltk 如何解析出英语短语?
  17. noip2003侦探推理详解
  18. 期初余额录入功能暂时不能执行
  19. OpenWRT安装及配置
  20. 论网络喷子的功力-关于全栈工程师那篇文

热门文章

  1. 如何让你的Linux程序程序后台运行
  2. java 返回类对象_JAVA如何实现返回不同类型的对象
  3. 在鹅厂工作的广西表妹教我用Python生成会跳舞的美女~
  4. lm3s811 学习笔记(三)【uart】
  5. 关于设置系统声音的方法
  6. 有些疑问,阿里云到底是做啥子的呢?
  7. mysql表关联查询都有什么方式_所有关联表查询方式
  8. 时间在线验证 java代码_timetest.java 源代码在线查看 - Java获取各种常用时间方法 资源下载 虫虫电子下载站...
  9. 产品经理交互设计师必备的已分类的《产品Axure原型库》
  10. HECTF 部分wp