Android 5.0一下分包最新解决办法

建议参照最新官方提供的分包方式 (科学上网)进行分包,具体配置方式在 multiDexKeepProguard 属性下 第一步、新建文件 app Module 下,新建一个名为multidex-config.pro的文件 文件内具体内容实例: -keep class me.passin.pmvp.app.GlobalConfiguration 即想把哪个类分在主Dex 则 -keep class 类名。 如果您想要指定包中的所有类,文件将如下所示: -keep class com.example.** { *; } 第二步、App模块的build.gradle添加配置参数 android { buildTypes{ release{ multiDexKeepProguard file('multidex-config.pro') } } }

八月 29, 2018 · 1 分钟 · LengYue

Android P 跳过Gapps开机引导

Android P跳过Gapps开机引导 Android手机在刷了Gapps之后,在开机进入系统时会进入Gapps的开机引导(也就是设置Google帐号神马的)。但是这需要连Google进行验证,于是。。。。。。。。 对于这种情况,可以通过以下方法解决: 连Google进行验证 断网 顺时针点屏幕四角 更改USER_SETUP_COMPLETE和DEVICE_PROVISIONED 连Google进行验证 这个方法就不多说了,只要能连上Google,就不会卡在这里了。至于怎么连Google,请自行寻找科学上网。 断网 这个Gapps的开机引导是需要连网进行的,默认的情况下如果不连网的情况下是会自动跳过的。但是许多系统在默认情况下Wifi和数据是会自动打开,就算把卡取了,也还会有Wifi,一样无法跳过。对此,可选择先不刷Gapps,进入系统后将Wifi的数据关闭,再刷Gapps,此方法有一定弊端,有可能会导致Gapps某些应用发生某些玄学问题。。。。。 顺时针点屏幕四角 这可能是最玄学的一个方法了,据传连点屏幕四角就可跳过此引导(顺时针方向,从左上角开始)。但是!!!但是!!!这是检验血统的时刻,时灵时不灵。别问我是怎么知道的。 (╯‵□′)╯︵┻━┻ 更改USER_SETUP_COMPLETE和DEVICE_PROVISIONED 敲黑板!!! 这是我所试过最科学的方法。在开机情况下,将手机连上电脑,使用adb工具来修改USER_SETUP_COMPLETE和DEVICE_PROVISIONED的值。具体操作如下: 打开命令行,输入命令: adb shell settings put secure user_setup_complete 1 adb shell settings put global device_provisioned 1 重启,搞定。 一般的类原生系统 ADB默认是打开的,及时没有进入系统,依旧可以通过ADB设置,手机官方系统一般ADB默认关闭的 注: 在WINDOWS下,如果未将adb.exe文件所在路径添加至环境变量中,则需要在adb.exe文件所在目录下打开命令行,而后将上述命令中的adb更改为./adb.exe。 上述命令运行错误时会有提示,而成功则没有。

八月 19, 2018 · 1 分钟 · LengYue

IOS的专利?Android也能流畅实现毛玻璃效果效果

背景介绍 上图就是我们在IOS设备上经常能够见到的毛玻璃(高斯模糊)效果。不得不说,这种效果在适合的场景下使用,能够获得绝佳的美感。但是鉴于Android设备性能和兼容性问题,我们通常很难在Android设备上见到这种效果。 但这并不是IOS的专利效果,Android也能轻松流畅的实现。本篇文章将会详细的讲解如何实现。 Android中的高斯模糊 我为什么选择RenderScript实现高斯模糊 目前Android设备上实现高斯模糊效果的方式通常有: 云端处理,移动客户端直接从网络获取处理好的图片。这种方式局限性很大。 FastBlur等开源库。这种方式兼容性不错,但是效率极低。 c实现。不懂c的理解困难。 OpenGL实现。效果很好,但电量和内存消耗比较高。 RenderScript实现。效果略弱于第4种,但是使用方便,速度很快,性能消耗在可接受范围内,加上Google的兼容性解决方案,可以说是能够作为优先考虑的方式。 RenderScript RenderScript主要在android中的对图形进行处理,RenderScript采用C99语法进行编写,主要优势在于性能较高。在Api11的时候被加入到Android中。同时,Google提供了android.support.v8.renderscript兼容包,能够实现更低版本的兼容。 RenderScript提供了一个用于实现高斯模糊的封装类ScriptIntrinsicBlur ,这货在Api17才被收编Android所以在不使用兼容包的情况下只能兼容到4.2的设备。但是,我们有兼容包啊向下兼容不是梦。 准备阶段 ###引入兼容包 方法很简单,只需在build.gradle中加入: defaultConfig { 。 。 。 //就是这么简单 renderscriptTargetApi 19 renderscriptSupportModeEnabled true } 你以为这样就好了?nonono。 由于一些坑人的厂商会深度定制Android系统,所以一些必要的依赖文件会被它们直接去掉!!这导致一些型号的设备上调用RenderScriptd的部分方法时会报错。所以我们得加上这些可能丢失的文件。 其实也简单,打开android_sdk/build-tools/选择19以上版本/renderscript/lib/packaged我们可以看见3个包含.os文件的文件夹。 直接复制这三个文件加到项目工程的jniLibs 包下。什么?找不见jniLibs包?自己建一个喽。 注意,这时候,我们很可能遇到一个崩溃,找不到.os文件。莫慌莫慌… 在build.gradle的android{}中加入: sourceSets { main { jniLibs.srcDirs = ['libs'] } } 没完没了!最后一步只针对使用的混淆的同学,需要在混淆中加入: -keep class android.support.v8.renderscript.** { *; } 实现高斯模糊 终于可以开始写代码了。先来看看效果。下图高斯模糊半径逐渐增大的效果,请忽略渣渣录屏效果 将ScriptIntrinsicBlur封装成工具类。咱们代码里接着款 import android.support.v8.renderscript.*; //这句很重要啊,v8包的,不然不能向下兼容啊。 public class RenderScriptGaussianBlur { private RenderScript rs; public RenderScriptGaussianBlur(Context context) { // 创建RenderScript内核对象 this....

八月 14, 2018 · 2 分钟 · LengYue

RecyclerView里notifyItemRemoved的坑

RecyclerView很多时候是展示静态的数据,并不会有删除的操作,讲到RecyclerView时,会提到它提供了一个很好的展现删除操作动画的函数,代码片段一般是这样的 @Override public void onBindViewHolder(final CommonViewHolder holder, final int position) { holder.itemView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { contentList.remove(position); notifyItemRemoved(position); } }); } 这样写的话,很快会产生数据删除错乱和超出索引异常导致崩溃。 原因是函数里面的传入的参数position,它是在进行onBind操作时确定的,在删除单项后,已经出现在画面里的项不会再有调用onBind机会,这样它保留的position一直是未进行删除操作前的postion值。 对于尚未进入画面的单项来说,它会使用新的position值,这个值是正确的,如果在单项里加上下面的代码 holder.textView.setText(contentList.get(position) + "#" + String.valueOf(position)); 在删除第一屏的一项后,向上滚动,会发现新滚上来的一行和它上面的一行的textview显示是一样的。 解决办法也很简单 先remove,再notifyItemRemoved, 最后再notifyItemRangeChanged remove:把数据从list中remove掉, notifyItemRemoved:显示动画效果 notifyItemRangeChanged:对于被删掉的位置及其后range大小范围内的view进行重新onBindViewHolder

八月 14, 2018 · 1 分钟 · LengYue

在视频列表中,实现对当前显示的视频的自动播放、跟踪、暂停

简单说一下原理,当RecycleView处于停滞状态的时候,通过findFirstVisibleItemPosition() findLastVisibleItemPosition()取出所有可视的Item,通过recyclerView.getChildAt(i)取出相应的Item的布局recyclerView.getChildAt(0)取出的永远是当前可见的第一个,在对所有的可见的item中的视频播放控件的可见区域作对比这里是通过Rect作比较的,如果有多个完整可见的视频播放控件,则可以比较视频播放控件是否在屏幕中央,距离屏幕中央的距离确认。 /** * Created by LengYue on 2017/9/16. */ public class VideoPlayListener extends RecyclerView.OnScrollListener { private static final String TAG = "VideoPlayListener"; private ArrayList<View> mViews; private IDataType mDataType; public VideoPlayListener(IDataType mDataType) { super(); mViews = new ArrayList<>(); this.mDataType = mDataType; } @Override public void onScrollStateChanged(RecyclerView recyclerView, int newState) { super.onScrollStateChanged(recyclerView, newState); LinearLayoutManager manager = (LinearLayoutManager) recyclerView....

八月 14, 2018 · 2 分钟 · LengYue

适配三星Galaxy S8及S8+

高达84%的屏幕占比为Galaxy S8及S8+在游戏娱乐、观看视频时带来深度沉浸式视觉体验。但是与此同时S8却有着一个奇葩的屏幕比例:18.5比9,屏幕分辨率:2960×1440。通常我们在开发过程中android的标准设计图为1920×1080,ios为1334×750,默认采用16比9的比例来设计效果图。 这是未适配的网易新闻 其实解决APP显示问题,除了第三方应用自行适配S8之外,S8自己也可以进行调节,S8有一个功能叫做“全屏应用程序” 打开全屏应用之后,效果显而易见: 下面我们以开发者的身份去分析下这个问题,究其根本这个适配不过是个显示的问题,我们只需要让APP充满全屏就可以,所以我做了如下尝试: 1:给Activity设置各种noTitlebar,FullScreen,不起作用; 2:替换各种style样式,不起作用; 3:修改targetSdkVersion, compileSdkVersion为高版本,依然不起作用。 通过观察发现,凡是完美适配了18.5比9屏幕的App,在系统中已经默认是全屏应用程序了,选择框灰掉无法点击。 而没有做好适配的App默认是没有打开全屏应用的,用户可以自行随意选择打开或者关闭 所以判断系统应该是通过检测某个属性或者权限来区分当前App是否做好了适配。最后我们找到了"android.max_aspect"这个属性。 开发者只需在App的AndroidManifest.xml文件 中添加如下代码: <meta-data android:name="android.max_aspect" android:value="2.1" /> 对只要这一行代码就搞定三星S8的适配,所以前面都是废话,你要的代码就这一行 Android 标准接口中,支持应用声明其支持的最大屏幕高宽比(maximum aspect ratio)。具体声明如下,其中的 ratio_float 被定义为是高除以宽,以16:9为例,ratio_float = 16/9 = 1.778 (18.5:9则为2.056)。 若开发者没有声明该属性,ratio_float 的默认值为1.86,小于2.056,因此这类应用在三星S8上,默认不会全屏显示,屏幕两边会留黑。

八月 14, 2018 · 1 分钟 · LengYue

unable to connect to 5555: connection refused

I had the same issue since the android 6 upgrading. I noticed that for some reason the device is playing “hard to get” when you try to contact it over WIFI. Try these following steps: Make sure that Aggressive Wi-Fi to Cellular handover under Networking section in the device’s developer options is turned off. ping continuously from your pc to the device to make sure it’s not in network idle mode ping -t 192....

七月 17, 2018 · 1 分钟 · LengYue

Android 7.0适配-应用之间共享文件(FileProvider)

一、前言 Android 7.0强制启用了被称作 StrictMode的策略,带来的影响就是你的App对外无法暴露file://类型的URI了。 如果你使用Intent携带这样的URI去打开外部App(比如:打开系统相机拍照),那么会抛出FileUriExposedException异常。 官方给出解决这个问题的方案,就是使用FileProvider: 这是常见的打开系统相机拍照的代码,拍照成功后,照片会存储在picFile文件中。 这段代码在Android 7.0之前是没有任何问题的(奇葩情况忽略~),但是如果你尝试在7.0的系统上运行(可以用模拟器测试,我也没真机~),会抛出文章开头提到的FileUriExposedException异常。 既然官方推荐使用FileProvider来解决此问题,我们就来看下如何使用吧~ ...

七月 8, 2018 · 2 分钟 · LengYue