alwaystest

Results 88 issues of alwaystest

# 从GoogleSamples--android-architecture学到的一种依赖注入方式 标签(空格分隔): Android 依赖注入 GoogleSamples --- 加了小创的单元测试微信群,昨天有一个群友问[TODO-MVP](https://github.com/googlesamples/android-architecture/blob/todo-mvp/todoapp/app/src/main/java/com/example/android/architecture/blueprints/todoapp/addedittask/AddEditTaskActivity.java)项目中`Injection.provideTasksRepository(getApplicationContext())`这行的用途。 本来他是问Injection类是怎么出来的。我下意识的以为是又一个APT生成代码的依赖注入框架生成的代码,按照Dagger2的套路,找不到的Injection类,只要编译一次,就可以生成代码了。但是我没有在build.gradle中发现apt有关的内容,或者另一个依赖注入的库。这就奇怪了。 后来下载了Todo-MVP的源码看了一下,没有我想的那么简单。Injection类是已经编写好的。由于使用了MVP,那么要编写单元测试,依赖注入是不可避免的。而这个Injection类就是写来做依赖注入的。比Dagger2简单粗暴。刷新了我的认知。 原理是这样的。 Gradle编译工程的时候,可以使用Flavor(build.gradle中的productFlavors项)来实现差异化打包。通过`mock`和`prod`两个Flavor,打包两个不同实现的Injection类,一个返回Mock对象,一个返回真实的依赖对象。这时,只要更改build Variant,就能实现更改依赖注入类型的功能。单元测试时,注入Mock对象,编译APK时,注入真实的依赖对象。 GoogleSamples真是一个学习单元测试的宝库。

# Android ShareSDK集成 标签(空格分隔): Android --- 为了方便,使用ShareSDK 2.7.6 来集成应用的分享功能。 先通读[官方WIKI](http://wiki.mob.com/Android_%E5%BF%AB%E9%80%9F%E9%9B%86%E6%88%90%E6%8C%87%E5%8D%97/),有几点说明比较模糊,记录一下。 首先去[官网](http://www.mob.com/#/downloadDetail/ShareSDK/android)下载最新版本的SDK,根据需求集成需要的平台,集成的越少,需要下载的SDK文件就越小。 运行`QuickIntegrater.jar`可以快速的生成一个“Android项目”,加引号的原因是相对以正常的Android项目,他缺少了AndroidManifest文件,因为是集成到一个已有的项目中去的,所以这里不需要这个文件。 使用`QuickIntegrater.jar`进行快速集成的时候,输入的项目名就是即将生成的Android项目的名字,包名是用来存放微信客户端回调Activity的java源文件的包名。输入的项目名其实无所谓啦,就是让你稍后能找到生成的项目在哪里。包名就比较重要了,因为Java源文件需要说明所在的package,就是这个啦,要是随便输的话,接下来要把这个文件放进项目中,还需要再根据情况更改Java源文件的package的。 生成快速集成的项目以后,除了这个项目以外的文件就没有用了,`QuickIntegrater.jar`就是根据项目名和包名自动整理了一下下载到的文件。 如果要直接集成到现有的项目中,按照官方说明做就好了。 但是如果不希望天天看到这么一堆将来不怎么可能更改的代码的话,我的选择是把ShareSDK作为Android Library Project 集成到项目中去。即Android Studio中的Module。 在Android中新建Module,注意选择为Library Project。这里要注意的是由于Gradle Plugin的Bug,Library Project会始终以release版本发布。 如果对Android Studio的Module (即Library Project)不了解的话,可以看看文章末尾我的一点看法,希望对理解这个概念有所帮助。 新建好Module以后,Android Studio会自动新建这个Module的Android...

# EasyPermissions使用 标签(空格分隔): Android --- Android 6.0 以上增加了运行时权限,为了图方便,直接使用Google官方的[EasyPermissions 0.1.9](https://github.com/googlesamples/easypermissions). 刚开始ReadME没有读清楚,犯了点小错误。记录一下。 文档的Basic这么写: > have your Activity (or Fragment) override the onRequestPermissionsResult method ``` public class MainActivity extends AppCompatActivity { @Override protected...

# Android使用SpannableString美化TextView 标签(空格分隔): Android --- 使用方式及效果参见 http://blog.csdn.net/candyguy242/article/details/13509591 在使用的时候发现如果对SpannableString的同一个地方使用两次setSpan,一次使用`ClickableSpan`添加点击效果,一次使用`ForegroundColorSpan`设置文字颜色。如果添加点击效果在后面的话,发现前面设置的文字颜色被覆盖掉了。 那么先设置点击效果,再设置文字颜色就可以了。 原因待深入研究SpannableString。

# Unity加载Android存储卡中的文件 标签(空格分隔): Unity Android --- 以加载图片显示到Unity中为例。 使用Unity 5.3。 Android Studio 2.2。 Android SDK 24 首先参照雨松的例子http://www.xuanyusong.com/archives/1480 Android中调用相机照相并裁剪网上已经有了许多的例子。这里只要能调用相机照相并且保存到指定路径即可,如果Unity读取大图片造成OOM问题,那还是再裁剪一下吧。 > 注解1:主要是路径”/mnt/sdcard/Android/data/com.xys/files”,如下图所示,我们在这里把文件保存在这个路径下。为什么要把图片2进制文件写在这里呢? 还记得以前MOMO给大家说过在Unity中访问Android或IOS本地2进制文件时用到的这个路径, > > Application.persistentDataPath 该路径等价于 /mnt/sdcard/Android/data/com.xys/files ,当然后者的包名是对应的工程包名,这样在Unity中可以找到对应裁剪后的图片文件,并且显示在Unity中。 实际上经过我这里测试,Unity需要访问的文件地址并非一定要放到`/mnt/sdcard/Android/data/com.xys/files`。只要在`AndroidManifest.xml`定义了`android.permission.WRITE_EXTERNAL_STORAGE`权限,Unity就可以读取到文件。 我在相机照完相之后,Android调用Unity开始读取图片,将相片的绝对路径传给Unity,Unity使用代码如下 ``` string...

# Android Studio 下 Library Project的BuildType问题 标签(空格分隔): Android Gradle --- 本来想利用Gradle的`buildConfigField`来控制Log是否显示,然后把Boolean值放到了Library Project的`build.gradle`里面,在代码中使用`BuildConfig.XXX`。结果发现更改BuildType以后并没有起到控制Log开关的效果。 最后发现这是一个Gradle Plugin的Bug,会导致library project始终以 release方式来编译。参见https://code.google.com/p/android/issues/detail?id=52962 [这里](http://stackoverflow.com/questions/27277433/why-does-gradle-build-my-module-in-release-mode-when-the-app-is-in-debug/30134955#30134955)给出了一个解决方法,鉴于我对Gradle脚本的语法不太熟悉,而且这是一个Bug级别的东西(还拖了3年没有修复!),所以就先麻烦些手动改release的`buildConfigField`。

# Android HierarchyViewer 真机上使用 标签(空格分隔): Android --- #### 首先参考下文和里面提到的官方文档 http://www.jianshu.com/p/84d24349e3c8 官方已经提供了在真机上使用HierarchyViewer的方法,首先需要设备解锁,不知道解锁是指解BootLoader的锁还是获取ROOT权限。 我的Nexus6P在Root之后开机提示设备Unlocked,已经达到条件。 4.1以上的设备需要配置开发电脑的环境变量,具体看[官方文档](https://developer.android.com/studio/profile/hierarchy-viewer-setup.html)。 调试的真机需要开启开发者选项。 然后就应该可以查看要调试的软件的Layout了。如果不行的话,重启HierarchyViewer,重启Android Studio,重启电脑试试。 Android Studio直接开启 Android Device Monitor,在右上角DDMS那里有类似于Eclipse的切换布局的按钮,切换到HierarchyViewer布局,就可以打开HierarchyViewer了,不需要到SDK文件夹里面去找可执行程序了。

# Unity3D调用Android原生方法 标签(空格分隔): Unity3D Android --- 研究Unity3D调用Android方法的时候,在网上找了许多文章,许多都是不了解Android的开发者写的,而雨松MOMO的那篇文章写于2012年,时间虽然久远但是依旧有参考价值。我要写的方法可能也需要有Android基础才能读懂,如果有疑问,可以在评论中提出。 1. 雨松的文章讲的是把Android代码打包成Jar包,然后使用Unity来调用的。 2. 我要写的方法是Unity导出Android项目,然后在Android Studio里面编写代码,使用Android Studio编译APK的。 以上两种方法都可以使用,目前我还不知道两种方法哪种更好。 --- ### 开发环境: - Unity3D 5.3.4f1 - Android Studio 2.1.2 ### 步骤: 首先 > 在Unity脚本里写调用安卓方法的时候,这个方法还不需要存在,你也不需要把安卓的代码压成jar包放进Unity工程. 我们放心的在Unity里编辑需要调用的方法。...

# Unity3D 处理JSON 之 SimpleJSON 标签(空格分隔): Unity3D JSON --- ### 简介 在使用Unity3D来处理JSON的序列化与反序列化的时候,Unity官方提供了JsonUtility[^footnote]([Blog][1]之前提到过)。据官方称,效率要比市面上的JSON处理插件高。但是我具体使用的时候发现JsonUtility反序列化需要使用泛型,必须有一个模板类,而且没有发现反序列化属性别名的方法, 为了方便开发,我选取了SimpleJSON来进行JSON字符串的处理。 [SimpleJSON](http://wiki.unity3d.com/index.php/SimpleJSON)的这个页面提供了一个简单的Example,简单到都没有提供手动`Add("key","value")`的用法。我在[讨论界面](http://wiki.unity3d.com/index.php/Talk:SimpleJSON)的`Test`类中找到了相关的用法,在页面的最底部。 我个人比较喜欢[Google Style](https://github.com/darcyliu/google-styleguide/blob/master/JSONStyleGuide.md)的JSON风格 > 双引号 > 使用双引号 > 如果(某个)属性需要引号,则必须使用双引号。所有的属性名必须在双引号内。字符类型的属性值必须使用双引号。其它类型值(如布尔或数字)不应该使用双引号。 而SimpleJSON处理出来的JSON风格是把数字,布尔值也使用双引号的。 ### JAVA转C#的坑 JAVA代码 ``` java System.out.println(obj); ```...

# Unity3D Native Plugin 标签(空格分隔): Unity3D --- 由于Unity3D目前使用Mono完成跨平台,编译非IOS平台的软件的时候生成的是IL(中间语言),使得生成的软件很容易被反编译而看到实现的逻辑。如果一些关键部分的代码不想被别人轻松看到,就需要使用别的语言比如C++,C,Objective-C来编写这部份代码,然后通过C#来调用,这样就可以提高一些安全性。但是没有攻不破的盾,我赞同只需要防住大部分的初级破解手段即可。 Unity3D的Plugin分为两种,一种是以C#语言编写,生成DLL(托管式插件)。一种是C,C++,Objective-C等编写的原生插件。 以使用C++编写原生插件为例。 在网上查找相关资料的时候发现网上现有的资料大部分都是选择使用Visual Studio来编译C++的代码,将生成的DLL文件直接放到`Assets/Plugins`下,调用即可。 但是在OSX开发环境下试运行会一直报一个错误,`DllNotFoundException`。 按照网上现有的资料,一一排除了x86和x64不匹配,DLL放置位置错误,最后发现OSX并不是使用DLL的,**原生插件需要根据各个平台生成对应的库,并且放置在对应的文件夹下**,OSX需要的是一个叫`bundle`的东西。 经过测试,将CPP文件使用Xcode编译成`***.bundle`,放到`Assets/Plugins`下,运行,不再报错。 可能使用Windows开发Unity3D的开发者太多了,很少有人顾及到OSX下的操作。 --- ### 关键: 需要按平台编译出对应的动态链接库。 Windows ==> ***.dll OSX ==> ***.bundle Android ==> libxxx.so IOS...