<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[ruancoder的博客]]></title><description><![CDATA[]]></description><link>https://blog.csdn.net/ruancoder</link><language>zh-cn</language><generator>https://blog.csdn.net/</generator><copyright><![CDATA[Copyright &copy; ruancoder]]></copyright><item><title><![CDATA[android6.0权限适配RxPermissions]]></title><link>https://blog.csdn.net/ruancoder/article/details/68939063</link><guid>https://blog.csdn.net/ruancoder/article/details/68939063</guid><author>ruancoder</author><pubDate>Fri, 31 Mar 2017 23:56:50 +0800</pubDate><description><![CDATA[1.直接获取权限(使用Retrolambda使代码更加简洁，当然并不是必须使用)：


// 必须在初始化阶段调用,例如onCreate()方法中
RxPermissions.getInstance(this)
    .request(Manifest.permission.CAMERA)
    .subscribe(granted -> {
        if (grante]]></description><category></category></item><item><title><![CDATA[Android 7.0 FileProvider]]></title><link>https://blog.csdn.net/ruancoder/article/details/68939043</link><guid>https://blog.csdn.net/ruancoder/article/details/68939043</guid><author>ruancoder</author><pubDate>Fri, 31 Mar 2017 23:54:47 +0800</pubDate><description><![CDATA[Android 7.0 设备已经逐渐普及了。然而和 6.0 系统的 运行时权限 类似， Google 又针对这个版本做了一些出于安全性考虑的改动。如果针对 24+ 的 SDK 版本 进行开发，你不得不做一些适配工作。


FileProvider是 Android 7.0 新增的一个类，位于 v4 包下，继承自四大组件之一的 ContentProvider ，因此需要 在清单配置文件里注册。]]></description><category></category></item><item><title><![CDATA[图片压缩]]></title><link>https://blog.csdn.net/ruancoder/article/details/68939024</link><guid>https://blog.csdn.net/ruancoder/article/details/68939024</guid><author>ruancoder</author><pubDate>Fri, 31 Mar 2017 23:50:33 +0800</pubDate><description><![CDATA[android 系统的图片压缩大体上有三种方式，质量压缩，比例压缩，采样率压缩


质量压缩
public static Bitmap getCompressBitmapByQuality(Bitmap bitmap, int quality) {
            ByteArrayOutputStream outputStream = new ByteArrayOutputSt]]></description><category></category></item><item><title><![CDATA[升级安装APK兼容Android7.0，解决FileUriExposedException]]></title><link>https://blog.csdn.net/ruancoder/article/details/67639621</link><guid>https://blog.csdn.net/ruancoder/article/details/67639621</guid><author>ruancoder</author><pubDate>Tue, 28 Mar 2017 17:44:34 +0800</pubDate><description><![CDATA[我们在开发app时避免不了需要添加应用内升级功能。当app启动时，如果检测到最新版本，将apk安装包从服务器下载下来，执行安装。

安装apk的代码一般写法如下，网上随处可以搜到
public static void installApk(Context context, File file) {
    Intent intent = new Intent(Intent.ACTION_VI]]></description><category></category></item><item><title><![CDATA[TabLayout属性介绍]]></title><link>https://blog.csdn.net/ruancoder/article/details/58596609</link><guid>https://blog.csdn.net/ruancoder/article/details/58596609</guid><author>ruancoder</author><pubDate>Tue, 28 Feb 2017 14:50:05 +0800</pubDate><description><![CDATA[1.什么是TabLayout
TabLayout提供了一个水平的布局用来展示Tabs。


使用时直接引用design库
compile 'com.android.support:design:25.1.0'
在清单文件中设置如下代码即可：
android:theme="@style/Theme.AppCompat"


2.TabLayout的基本使用方式
在布局中加入该控]]></description><category></category></item><item><title><![CDATA[微信支付踩坑之旅]]></title><link>https://blog.csdn.net/ruancoder/article/details/54684657</link><guid>https://blog.csdn.net/ruancoder/article/details/54684657</guid><author>ruancoder</author><pubDate>Mon, 23 Jan 2017 01:14:26 +0800</pubDate><description><![CDATA[前言，作为一名有经验的开发人员，竟然被集成微信支付这么一个小小的功能坑的吐血。文档不详细不够规范，Demo可以说是小学生写的吗，而且几年未更新了。。。虽然代码量很少，但是坑实在是多。

一.客户端的坑

在调用IWXAPI对象的registerApp()之前，我们需要先创建IWXAPI对象，那么这个对象该如何创建呢？

Demo是这样写的：
IWXAPI api = WXAPIFac]]></description><category></category></item><item><title><![CDATA[Android中主流状态栏效果实现]]></title><link>https://blog.csdn.net/ruancoder/article/details/54571720</link><guid>https://blog.csdn.net/ruancoder/article/details/54571720</guid><author>ruancoder</author><pubDate>Mon, 16 Jan 2017 10:43:55 +0800</pubDate><description><![CDATA[Android在早期的系统版本中，状态栏是不支持修改的，所以打开任何应用程序会发现顶部的状态栏始终是黑条。在Android 4.4（KitKat）之后，系统的状态栏开始支持开发者定制和修改，包括显示或隐藏，更改颜色等（嗯，一定是抄袭ios的...），又在Android 5.0（LOLLIPOP）进行了改进。这样一来，我们就可以让系统状态栏跟随应用程序改变了。

下面总结了市面上几种常见的Sta]]></description><category></category></item><item><title><![CDATA[总结Android调用系统相机拍照遇到的坑]]></title><link>https://blog.csdn.net/ruancoder/article/details/54344171</link><guid>https://blog.csdn.net/ruancoder/article/details/54344171</guid><author>ruancoder</author><pubDate>Wed, 11 Jan 2017 15:46:02 +0800</pubDate><description><![CDATA[拍照功能在应用开发中几乎已成为标配，例如用户通过拍照上传头像。实现拍照功能的方式有两种。第一种是使用相机API（即Camera类）来自定义拍照，第二种是使用Intent调用系统相机来拍照。其中最常见的方式是直接调用系统相机拍照来获取照片。

调用系统相机获取照片的流程如下，这里省去了声明权限和动态权限申请：
private String mFilePath;// 需要初始化，路径自定义
pr]]></description><category></category></item><item><title><![CDATA[Android中的文件存储位置分析]]></title><link>https://blog.csdn.net/ruancoder/article/details/54290807</link><guid>https://blog.csdn.net/ruancoder/article/details/54290807</guid><author>ruancoder</author><pubDate>Mon, 09 Jan 2017 17:26:19 +0800</pubDate><description><![CDATA[应用开发过程中，避免不了需要使用到文件存储。Android在不同的系统版本中，对存储空间的使用限制会有所不同。如在6.0以上版本，对于外置存储空间的使用，需要动态申请权限，而6.0以下则不需要。不同的存储路径同样也会有区别。如内置存储空间无需权限申请可直接使用，而外置存储空间则可能会需要相应的权限。

在存储文件或缓存数据时，我们需要尽量做到以下几点：
(1).不要随意占用用户的内置存储。]]></description><category></category></item><item><title><![CDATA[Android6.0动态权限分析]]></title><link>https://blog.csdn.net/ruancoder/article/details/53958947</link><guid>https://blog.csdn.net/ruancoder/article/details/53958947</guid><author>ruancoder</author><pubDate>Sat, 31 Dec 2016 23:10:16 +0800</pubDate><description><![CDATA[group:android.permission-group.CONTACTS
    permission:android.permission.WRITE_CONTACTS
    permission:android.permission.GET_ACCOUNTS    
    permission:android.permission.READ_CONTACTS


  gr]]></description><category></category></item><item><title><![CDATA[实现WebView中点击图片显示大图]]></title><link>https://blog.csdn.net/ruancoder/article/details/53958773</link><guid>https://blog.csdn.net/ruancoder/article/details/53958773</guid><author>ruancoder</author><pubDate>Sat, 31 Dec 2016 22:35:50 +0800</pubDate><description><![CDATA[在新闻资讯app中，点击图片可以查看大图显示，如华尔街见闻。实现该功能，主要在于如何响应网页图片的点击事件，并获取到图片链接地址。而WebView里的交互操作，我们很容易想到使用Java与Javascript交互。好的，思路已经有了，为网页里的图片添加点击事件，在js里调用java代码，跳转到查看大图的页面，并将图片地址传递过去。

下面，我们分三步来实现该功能。

(1).创建Javas]]></description><category></category></item><item><title><![CDATA[实现UC浏览器启动应用时引导用户开启存储空间权限]]></title><link>https://blog.csdn.net/ruancoder/article/details/53819163</link><guid>https://blog.csdn.net/ruancoder/article/details/53819163</guid><author>ruancoder</author><pubDate>Thu, 22 Dec 2016 19:41:41 +0800</pubDate><description><![CDATA[在Android6.0之前，需要声明权限时，我们只需在AndroidManifest.xml中声明即可。但是在Android6.0之后的版本中，我们除了需要在AndroidManifest.xml中声明之外，还需要在使用该权限时动态向用户申请，且只有当用户允许以后，才能够正常使用。

如果我们的应用在使用过程中，必须要使用到外部存储空间，比如下载类、工具类应用，那么如何友好的引导用户开启存储空]]></description><category></category></item><item><title><![CDATA[浅析Fragment中startActivityForResult()与getActivity().startActivityForResult()的异同]]></title><link>https://blog.csdn.net/ruancoder/article/details/53490500</link><guid>https://blog.csdn.net/ruancoder/article/details/53490500</guid><author>ruancoder</author><pubDate>Tue, 06 Dec 2016 18:13:31 +0800</pubDate><description><![CDATA[在Fragment类中启动另一个Activity并获取返回结果，可以使用this.startActivityForResult()，也可以使用getActivity().startActivityForResult()。那么，这两种方式有何异同呢？

先来看一个示例。

创建TestFragment类，继承自Fragment。添加一个按钮，点击后启动另一个Activity，重写Fragme]]></description><category></category></item><item><title><![CDATA[微信登录、分享到微信]]></title><link>https://blog.csdn.net/ruancoder/article/details/53415526</link><guid>https://blog.csdn.net/ruancoder/article/details/53415526</guid><author>ruancoder</author><pubDate>Wed, 30 Nov 2016 23:37:31 +0800</pubDate><description><![CDATA[添加必要的权限支持:

   
 



[1] 注册到微信

要使你的程序启动后微信终端能响应你的程序，必须在代码中向微信终端注册你的id。（如下图所示，可以在程序入口Activity的onCreate回调函数处，或其他合适的地方将你的应用id注册到微信。

[2] 发送请求或响应到微信

现在，你的程序要发送请求或发送响应到微信终端，可以通过IWXAPI的 sendR]]></description><category></category></item><item><title><![CDATA[android 6.0权限判断]]></title><link>https://blog.csdn.net/ruancoder/article/details/53415327</link><guid>https://blog.csdn.net/ruancoder/article/details/53415327</guid><author>ruancoder</author><pubDate>Wed, 30 Nov 2016 23:15:41 +0800</pubDate><description><![CDATA[//判断是否开户相册权限
                                if (PackageManager.PERMISSION_GRANTED ==   ContextCompat.checkSelfPermission(context, android.Manifest.permission.CAMERA)) {


                        ]]></description><category></category></item><item><title><![CDATA[WebView与JavaScript交互]]></title><link>https://blog.csdn.net/ruancoder/article/details/53402088</link><guid>https://blog.csdn.net/ruancoder/article/details/53402088</guid><author>ruancoder</author><pubDate>Tue, 29 Nov 2016 23:31:59 +0800</pubDate><description><![CDATA[settings.setJavaScriptEnabled(true);
mWebView.addJavascriptInterface(new JavascriptInterface(), "android");
mWebView.loadUrl(mUrl);


class JavascriptInterface {
        @android.webkit.Javascri]]></description><category></category></item><item><title><![CDATA[使用Gson生成和解析json数据]]></title><link>https://blog.csdn.net/ruancoder/article/details/53401876</link><guid>https://blog.csdn.net/ruancoder/article/details/53401876</guid><author>ruancoder</author><pubDate>Tue, 29 Nov 2016 23:06:35 +0800</pubDate><description><![CDATA[Gson 是 Google 提供的用来在 Java 对象和 JSON 数据之间进行映射的 Java 类库。可以将一个 JSON 字符串转成一个 Java 对象，或者反过来。


项目链接：
https://github.com/google/gson


示例代码：


Gson gson = new Gson();
int[] ints = {1, 2, 3, 4, 5};]]></description><category></category></item><item><title><![CDATA[设计模式之命令模式]]></title><link>https://blog.csdn.net/ruancoder/article/details/52976431</link><guid>https://blog.csdn.net/ruancoder/article/details/52976431</guid><author>ruancoder</author><pubDate>Mon, 31 Oct 2016 00:11:21 +0800</pubDate><description><![CDATA[定义
将“请求”封装成对象，以便使用不同的请求、队列或者日志来参数化其他对象。命令模式也支持可撤销的操作。

结构
客户端(Client)：创建一个具体命令(ConcreteCommand)对象并确定其接收者。
命令(Command)：声明了一个给所有具体命令类的抽象接口。
具体命令(ConcreteCommand)：定义一个接收者和行为之间的弱耦合；实现execute()方法，负责调]]></description><category></category></item><item><title><![CDATA[设计模式之适配器模式]]></title><link>https://blog.csdn.net/ruancoder/article/details/52975763</link><guid>https://blog.csdn.net/ruancoder/article/details/52975763</guid><author>ruancoder</author><pubDate>Sun, 30 Oct 2016 23:01:48 +0800</pubDate><description><![CDATA[适配器模式将一个类的接口，转换成客户期望的另一个接口。适配器让原本接口不兼容的类可以合作无间。





现在，我们知道，这个模式可以通过创建适配器进行接口转换，让不兼容的接口变成兼容。这可以让客户从实现的接口解耦。如果在一段时间之后，我们想要改变接口，适配器可以将改变的部分封装起来，客户就不必为了应对不同的接口而每次跟着修改。


一个适配器需要做多少“适配”的工作？如果我需要]]></description><category></category></item><item><title><![CDATA[设计模式之工厂模式]]></title><link>https://blog.csdn.net/ruancoder/article/details/52973402</link><guid>https://blog.csdn.net/ruancoder/article/details/52973402</guid><author>ruancoder</author><pubDate>Sun, 30 Oct 2016 18:47:24 +0800</pubDate><description><![CDATA[工厂方法模式定义了一个创建对象的接口，但由子类决定要实例化的类是哪一个。工厂方法让类把实例化推迟到子类。


工厂方法模式能够封装具体类型的实例化。看看下面的类图，抽象的Creator提供了一个创建对象的方法的接口，也成为“工厂方法”。在抽象的Creator中，任何其他实现的方法，都可能使用到这个工厂方法所制造出来的产品，但只有子类真正实现这个工厂方法并创建产品。




当只有一]]></description><category></category></item></channel></rss>