(1)将Eclipse项目导入到Android studio 中 很多点9图出现问题解决方法:
在build.gradle里添加以下两句:
aaptOptions.cruncherEnabled = false
aaptOptions.useNewCruncher = false
用来关闭Android Studio的PNG合法性检查的,直接不让它检查。
(2)Android Studio 错误: 非法字符: ‘\ufeff’ 解决方案|错误: 需要class, interface或enum
(3)将项目导入到AS中出现以下问题:
Error:Execution failed for task ':app:transformResourcesWithMergeJavaResForDebug'. > com.android.bui
解决方法:
在build.grade中添加以下代码:
android{
packagingOptions {
exclude ‘META-INF/DEPENDENCIES.txt’
exclude ‘META-INF/NOTICE’
exclude ‘META-INF/NOTICE.txt’
exclude ‘META-INF/LICENSE’
exclude ‘META-INF/LICENSE.txt’
}
}
(4)未知错误
Error:Timeout waiting to lock cp_proj class cache for build file '/Users/Mr.xiao/Desktop/AndroidShopNC2014MoblieNew/androidShopNC2014Moblie/build.gradle'
(/Users/Mr.xiao/.gradle/caches/2.10/scripts/build_3cyr7hzjurcc62ge3ixidshos/cp_proj).
It is currently in use by another Gradle instance.
Owner PID: unknown
Our PID: 1412
Owner Operation: unknown
Our operation: Initialize cache
Lock file: /Users/Mr.xiao/.gradle/caches/2.10/scripts/build_3cyr7hzjurcc62ge3ixidshos/cp_proj/cache.properties.lock
(5)修改了Android项目的最小SDK版本之后出现很多stysle文件找不到
解决方案
compileSdkVersion 23
buildToolsVersion “23.0.3”
defaultConfig {
applicationId “net.mmloo2014.android”
minSdkVersion 14
targetSdkVersion 23
}
compileSdkVersion 是多少版本的
那么compile ‘com.android.support:appcompat-v7:23.2.1’ 就是啥版本的。
(6)Android studio 编译问题:finished with non-zero exit value 2
问题:
Error:Execution failed for task ‘:androidShopNC2014Moblie:transformClassesWithDexForDebug’.
com.android.build.api.transform.TransformException:
com.android.ide.common.process.ProcessException:
java.util.concurrent.ExecutionException:
com.android.ide.common.process.ProcessException:
org.gradle.process.internal.ExecException:
Process ‘command ‘/Library/Java/JavaVirtualMachines/jdk1.7.0_79.jdk/Contents/Home/bin/java” finished with non-zero exit value 2
解决方案
这个错误在app的build.gradle里面添加下面这句就好了。
android {
defaultConfig {
multiDexEnabled true
}
}
(7)Android studio 编译问题:finished with non-zero exit value 1(由于导入的依赖出现重复造成的)
问题:
Error:Execution failed for task ‘:app:transformClassesWithDexForDebug’.
com.Android.build.api.transform.TransformException: com.android.ide.common.process.ProcessException: org.gradle.process.internal.ExecException: Process ‘command ‘F:\Program Files (x86)[Java](http://lib.csdn.net/base/17)\jdk1.8.0_31\bin\java.exe” finished with non-zero exit value 1
解决方案
这个是因为依赖包重复了 (像v4和nineoldandroids),app中实现了对easeUI的依赖,但是app和easeUI都添加了对这个包的依赖。所以就报这个错误,修改之后再报,就clean,rebuild一下。
(8)问题
Error:Execution failed for task
':app:transformClassesWithJarMergingForDebug'.>
com.android.build.api.transform.TransformException:
java.util.zip.ZipException:
duplicate entry: org/apache/http/ConnectionClosedException.class
(9)添加第三方依赖出现的问题
Error:Execution failed for task ':app:processDebugManifest'.
>
Manifest merger failed :
uses-sdk:minSdkVersion 14 cannot be smaller than version 19 declared in library [com.github.meikoz:basic:2.0.3]
/AndroidStudioCode/EnjoyLife/app/build/intermediates/exploded-aar/
com.github.meikoz/basic/2.0.3/AndroidManifest.xml
Suggestion: use tools:overrideLibrary="com.android.core" to force usage
解决方案
在AndroidManifest.xml文件中标签中添加
其中的xxx.xxx.xxx为第三方库包名,如果存在多个库有此异常,则用逗号分割它们,例如:
这样做是为了项目中的AndroidManifest.xml和第三方库的AndroidManifest.xml合并时可以忽略最低版本限制。
(10)Android studio 编译问题:finished with non-zero exit value 1(由于buildtools版本太高造成的)
错误
Error:Execution failed for task ‘:app:transformClassesWithDexForDebug’.
com.android.ide.common.process.ProcessException:
org.gradle.process.internal.ExecException:
Process ‘command ‘/Library/Java/JavaVirtualMachines/jdk1.7.0_79.jdk/Contents/Home/bin/java” finished with non-zero exit value 1
错误原因
buildToolsVersion版本太高,我原来的 buildToolsVersion “24.0.0” 需要jdk1.8,而我的是jdk1.7,所以一直报这个错,刚开始以为是v4包和V7包冲突,因为之前遇到这样的问题,而这次删除V4包之后依然报这个错,上stackoverflow搜了一下,把buildTools版本降下来就好了。
解决方案
android {
compileSdkVersion 23
buildToolsVersion “23.0.3”
}
(11)Android studio 编译问题:Gradle DSL not found ‘android()’
clipboard.png
配置build.gradle:
buildscript {
repositories { jcenter()}
dependencies {
classpath ‘com.android.tools.build:gradle:2.1.2’
}
}
allprojects {
repositories {
jcenter()
}
}
配置app/build.gradle:
apply plugin: ‘com.android.application’
android {
…
defaultConfig { …}
}
dependencies { …}
最后再同步一下sync即可。
(12)Android studio 编译问题:Gradle DSL not found ‘android()’
问题描述
Error:(51, 52) 错误: -source 1.6 中不支持 diamond 运算符
(请使用 -source 7 或更高版本以启用 diamond 运算符)
解决方案
将标红处设置为1.7.png
修改soure为1.7.png
方案二
在build gradle中进行配置如下代码:
android {
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_7
targetCompatibility JavaVersion.VERSION_1_7
}
}
最后同步一下即可
(13)Glide使用问题:使用Glide加载圆角图片,第一次显示占位图
方案一
不设置占位图 推荐
/**
* 显示圆形图片
* @param context
* @param url
* @param iv
*/
public static void loadCircleImage(final Context context, String url, final ImageView iv) {
Glide.with(context).load(url).asBitmap().centerCrop()
.placeholder(R.mipmap.default_user_icon)
.error(R.mipmap.default_user_icon)
.diskCacheStrategy(DiskCacheStrategy.RESULT)
.into(new BitmapImageViewTarget(iv) {
@Override
protected void setResource(Bitmap resource) {
RoundedBitmapDrawable circularBitmapDrawable =
RoundedBitmapDrawableFactory.create(context.getResources(), resource);
circularBitmapDrawable.setCircular(true);
iv.setImageDrawable(circularBitmapDrawable);
}
});
方案二
使用Glide的Transformation API自定义圆形Bitmap的转换
/**
* Glide圆形图片处理
*/
static class CircleTransform extends BitmapTransformation {
public CircleTransform(Context context) {
super(context);
}
@Override
protected Bitmap transform(BitmapPool pool, Bitmap toTransform, int outWidth, int outHeight) {
return circleCrop(pool, toTransform);
}
private static Bitmap circleCrop(BitmapPool pool, Bitmap source) {
if (source == null) return null;
int size = Math.min(source.getWidth(), source.getHeight());
int x = (source.getWidth() - size) / 2;
int y = (source.getHeight() - size) / 2;
Bitmap squared = Bitmap.createBitmap(source, x, y, size, size);
Bitmap result = pool.get(size, size, Bitmap.Config.RGB_565);
if (result == null) {
result = Bitmap.createBitmap(size, size, Bitmap.Config.ARGB_8888);
}
Canvas canvas = new Canvas(result);
Paint paint = new Paint();
paint.setShader(new BitmapShader(squared, BitmapShader.TileMode.CLAMP, BitmapShader.TileMode.CLAMP));
paint.setAntiAlias(true);
float r = size / 2f;
canvas.drawCircle(r, r, r, paint);
return result;
}
@Override
public String getId() {
return getClass().getName();
}
}
使用方法:
Glide.with(context).load(imageUrl).placeholder(placeholder).error(errorImage).transform(new CircleTransform(context)).into(imageView);
方案三
重写Glide的图片加载监听方法,具体如下:
Glide.with(mContext)
.load(url)
.placeholder(R.drawable.loading_drawable)
.into(new SimpleTarget(width, height) {
@Override public void onResourceReady(Bitmap bitmap, GlideAnimation anim) {
// setImageBitmap(bitmap) on CircleImageView
}
});
注意事项:
该方法在listview上复用有问题的bug,如果在listview中加载CircleImageView,请不要使用该方法。
方案四:不使用Glide的默认动画:
Glide.with(mContext)
.load(url)
.dontAnimate()
.placeholder(R.drawable.loading_drawable)
.into(circleImageview);
(14)json数据解析问题:json串头部出现字符:”\ufeff” 解决方法
异常信息
org.json.JSONException: Value of type java.lang.String cannot be converted to JSONObject
解析服务器返回 的json格式数据时,我们可能会发现,数据格式上是没有问题的,但是仔细对比会发现,在json串头部发现字符:”\ufeff”
客户端解决方案:
/**
* 异常信息:org.json.JSONException: Value of type java.lang.String cannot be converted to JSONObject
* json串头部出现字符:"\ufeff" 解决方法
* @param data
* @return
*/
public static final String removeBOM(String data) {
if (TextUtils.isEmpty(data)) {
return data;
}
if (data.startsWith("\ufeff")) {
return data.substring(1);
}
else {
return data;
}
}
服务器端解决方案:
将输出此json的php源码重新用editplus之类用utf-8无BOM的编码保存。不要用windows系统自带的记事本编辑php源码,这个BOM就是记事本这些windows自带的编辑器引入的。
(15)Android studio编译问题:not found ndk()
问题
Error:(15, 0) Gradle DSL method not found: 'ndk()' method-not-found-ndk
解决方案
出现该问题,可能是由于ndk配置在build.gradle配置文件中位置弄错导致的
apply plugin: 'com.android.application'
android {
compileSdkVersion 23
buildToolsVersion "23.0.2"
defaultConfig {
applicationId "com.guitarv.www.ndktest"
minSdkVersion 17
targetSdkVersion 23
versionCode 1
versionName "1.0"
ndk {
moduleName = "HelloJNI"
}
sourceSets.main {
jni.srcDirs = []
jniLibs.srcDir "src/main/libs"
}
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
(16)Android studio导入其他的项目:UnsupportedMethodException
问题
UnsupportedMethodException
Unsupported method: AndroidProject.getPluginGeneration().
The version of Gradle you connect to does not support that method.
To resolve the problem you can change/upgrade the target version of Gradle you connect to.
Alternatively, you can ignore this exception and read other information from the model.
错误截图
解决方案
将根目录中的build.gradle文件中的gradle版本号,出现错误之前,我的是1.3.0,修改成2.2.0之后重新编译一下就可以运行了。
dependencies {
classpath 'com.android.tools.build:gradle:1.3.0'
}
将这个版本号改成你其他项目能够运行成功的版本号即可
(17)Android studio更新到2.1.1之后使用CollapsingToolbarLayout出现Error inflating class CollapsingToolbarLayout
之前在项目中使用了CollapsingToolbarLayout,效果还是可以的,但是Android stuido更新到2.1.1版本之后出现Error inflating class CollapsingToolbarLayout 异常崩溃
异常信息如下所示:
com.test.android/com.test.android.ui.activity.RandomActivity}: android.view.InflateException: Binary XML file line #22: Error inflating class android.support.design.widget.CollapsingToolbarLayout
。。。
Caused by: java.lang.NoSuchMethodError: No static method setLayoutDirection(Landroid/graphics/drawable/Drawable;I)V in class Landroid/support/v4/graphics/drawable/DrawableCompat; or its super classes (declaration of 'android.support.v4.graphics.drawable.DrawableCompat' appears in /data/app/com.test.android-1/base.apk)
。。。
解决方案
在项目的build.gradle文件中添加下面一行,同步一下即可
compile ('com.android.support:support-v4:23.4.0'){
force = true;
}
StackOverFlow解决方案
(18)Android studio gradle编译异常
java.lang.UnsupportedClassVersionError: com/android/build/gradle/AppPlugin : Unsupported major.minor version 52.0
很显然是class版本不支持。经查询,Android Studio2.2必须使用JDK8及以上版本,而且是强制的。
所以呢,赶紧下了个JDK8最新版的。安装完毕,把JAVA_HOME指向了JDK8,实测JDK7和8是可以共存的。
那么,重启Android Studio后问题解决,Build Successful !
(19)电脑突然断电,Android studio 工程代码全部报错,找不到android sdk 的依赖包,clean、重启都没有用
前几天公司搬家,正准备同步代码,突然断电、等把电脑搬到新办公楼,打开AS发现所有的项目代码报错,找不到android 依赖包,clean、重启都没有用,
(20)recycleview嵌套列表项显示不全问题
解决方案:
第一个RecyclerView的Adapter(即父RecyclerView):
@Override
public MyHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.shop_item,null); 解决条目显示不全
MyHolder holder = new MyHolder(view);
return holder;
}
第二个RecyclerView的Adapter(即子RecyclerView):
@Override
public MyHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.check_item, parent,false);//解决宽度不能铺满
MyHolder holder = new MyHolder(view);
return holder;
}
(21)Android手机真机调试,日志不打印的解决方案:
1、在拨号界面输入:*#*#2846579#*#* 进入测试菜单界面。
2、Project Menu–后台设置–LOG设置
3、LOG开关–LOG打开 LOG级别设置–VERBOSE
4、Dump&Log– 全部选中
5、重启手机
(22)java.lang.IndexOutOfBoundsException Inconsistency detected. Invalid item position 2(offset:2).state:4
解决方案:Recyclerview在下拉刷新时,如果在数据没更新到之前将list clear 之后,迅速滑动会造成crash,所以一般在下拉刷新之前,等数据刷新回来再把之前的数据进行清除。
(23)**使用友盟分享——微信、朋友圈分享出现java.lang.NoClassDefFoundError: org.apache.http.entity.mime.MultipartEntity
**
解决方案: 造成这样的原因是因为缺少httpmime_jar,添加是httpmime_jar包之后即可正常分享
(24)Fragment中调用getActivity()出现空指针异常
解决方案:
对于上面的问题,可以考虑下面这两种解决办法:
1、不保存fragment的状态:在MyActivity中重写onSaveInstanceState方法,将super.onSaveInstanceState(outState);注释掉,让其不再保存Fragment的状态,达到fragment随MyActivity一起销毁的目的。
2、重建时清除已经保存的fragment的状态:在恢复Fragment之前把Bundle里面的fragment状态数据给清除。方法如下:
if(savedInstanceState!= null)
{
String FRAGMENTS_TAG = "android:support:fragments";
savedInstanceState.remove(FRAGMENTS_TAG);
}
(25)RecyclerView嵌套使用切换页面出现自动滚动问题
原因:
造成这样的原因是由于子RecyclerView抢占焦点导致的,如果你去查看RecyclerView的源码会发现,它会在构造方法中调用setFocusableInTouchMode(true),所以,设为false可以解决这个问题。
解决方案
在子RecyclerView中调用如下方法
//设置焦点不需要
secondRvList.setFocusableInTouchMode(false);
secondRvList.requestFocus();
(26)Android 7.0设备拍照闪退问题
原因:
Android 7.0 做了一些系统权限更改,为了提高私有文件的安全性,面向 Android 7.0 或更高版本的应用私有目录被限制访问,此设置可防止私有文件的元数据泄漏,如它们的大小或存在性。而此权限更改有多重副作用,其中之一就是当传递软件包网域外的 file:// URI 可能给接收器留下无法访问的路径。因此,尝试传递 file:// URI 会触发 FileUriExposedException。分享私有文件内容的推荐方法是使用 FileProvider。在应用间共享文件对于面向 Android 7.0 的应用,Android 框架执行的 StrictMode API 政策禁止在您的应用外部公开 file:// URI。如果一项包含文件 URI 的 intent 离开您的应用,则应用出现故障,并出现 FileUriExposedException 异常。要在应用间共享文件,应发送一项 content:// URI,并授予 URI 临时访问权限。进行此授权的最简单方式是使用 FileProvider 类。点击查看Android官方说明
解决方案
1.在清单文件添加如下代码
android:authorities="com.alex.demo.FileProvider" 自定义的权限
android:exported="false" 是否设置为独立进程
android:grantUriPermissions="true" 是否拥有共享文件的临时权限
android:resource="@xml/external_storage_root" 共享文件的文件根目录,名字可以自定义
2.在xml文件夹目录下新建provider_paths文件,名字自定义,添加如下代码
3.调用系统相机处代码处理
//调用系统相机拍照
Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
if (cameraIntent.resolveActivity(getActivity().getPackageManager()) != null) {
cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, parUri(tempFile));
startActivityForResult(cameraIntent, REQUEST_CAMERA);
}
/**
* 生成uri
* @param cameraFile
* @return
*/
private Uri parUri(File cameraFile) {
Uri imageUri;
String authority = getContext().getPackageName()+ ".provider";
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
//通过FileProvider创建一个content类型的Uri
imageUri = FileProvider.getUriForFile(getContext(), authority, cameraFile);
} else {
imageUri = Uri.fromFile(cameraFile);
}
return imageUri;
}
(27)ProcessException: Return code 1 for dex process
问题实际原因还是Apps over 64k method,
解决方案:
https://developer.Android.com/intl/zh-cn/tools/building/multidex.html
方案1:使用插件化框架 比如: https://github.com/singwhatiwanna/dynamic-load-apk
方案2:分割Dex
主要说说Dex分割
1、开发环境是eclipse时的解决方案:
在project.properties中添加一行 dex.disable.merger = true
2、Android Studio在app的 build.gradle 中
(1)在dependencies 中添加 compile ‘com.android.support:multidex:1.0.1‘
(2)在 defaultConfig 中添加multiDexEnabled true
android {
compileSdkVersion 21
buildToolsVersion "21.1.0"
defaultConfig {
...
minSdkVersion 14
targetSdkVersion 21
...
// Enabling multidex support.
multiDexEnabled true
}
...
}
dependencies {
compile 'com.android.support:multidex:1.0.1'
}
(3) 如果你的应用程序继承 Application , 那么你需要重写并继承 MultiDexApplication. 并添加以下代码。(晕,不添加也可以???)
/** * 分割 Dex 支持 * @param base */
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
MultiDex.install(this);
}
当没有继承Application 时,
manifest application 标签中添加
...
在gradle.properties加上android.enableAapt2=false
可解决