天天看点

Android开发者珍藏必备【常见错误篇】

Android开发者珍藏必备【常见错误篇】

【0】java.lang.OutOfMemoryError  OutOfMemoryError thrown while trying to throw OutOfMemoryError; no stack trace available

OOM是常见的java错误,OOM主要有:

1.OOM fo heapjava.lang:OutOfMemoryError: Java heap space,此OOM是由于JVM中heap的最大值不满足需要,将设置heap的最大值调高即可。

2.OOM for Perm:java.lang:OutOfMemoryError: Java perm space,此OOM是由于JVM中perm的最大值不满足需要,将设置perm的最大值调高即可,参数样例为:-XX:MaxPermSize=512M

3.OOM for GC=>例如:java.lang:OutOfMemoryError: GC overhead limit exceeded,此OOM是由于JVM在GC时,对象过多,导致内存溢出,建议调整GC的策略

4.OOM for native thread created:java.lang.OutOfMemoryError: unable to create new native thread,此OOM是由于进程剩余的空间不足,导致创建进程失败

5.OOM for allocate huge array:Exception in thread "main": java.lang.OutOfMemoryError: Requested array size exceeds VM limit,此类信息表明应用程序(或者被应用程序调用的APIs)试图分配一个大于堆大小的数组

6.OOM for small swap:Exception in thread "main": java.lang.OutOfMemoryError: request <size> bytes for <reason>. Out of swap space?,抛出这类错误,是由于从native堆中分配内存失败,并且堆内存可能接近耗尽

7.OutOfMemoryError thrown while trying to throw OutOfMemoryError; no stack trace available,抛出这类错误,一般是由于方法重复调用、死循环引起,直至内存耗尽

【1】无法使用网络:Permission denied(maybe missing internet permission)

解决办法:在AndroidMainifest.xml中增加允许使用网络选项(在</application>结束标签之后>):

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

【2】R文件丢失:(一般是资源文件有错,特别是clean之后)

原因:res文件夹的xml文件(不仅是layout,还包括其他)缺少了必要的属性或者添加了错误的属性。

【3】找不到activity类: android.content.ActivityNotFoundException: Unable to find explicit activity class {xxxx}

解决办法:在AndroidMainifest.xml中增加activity的申明,如:

 <activity android:name=".xxxActivity" > </activity>

【4】无法下载文件到SD卡中

解决办法:在manifest文件中加上:<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

【5】ListView不能触发OnItemClickListener监听器

解决办法:检查行所绑定的行布局文件中是否使用了EditText,如果有的话将EditText的focusable 属性设为false。

【6】java.lang.UnsupportedOperationException: Can't convert to dimension:type=0x2

原因:Xml文件布局属性有错误(互相间有冲突)。

【7】将Eclipse项目导入到Android studio 中 很多点9图出现问题解决方法

aaptOptions.cruncherEnabled = false     

aaptOptions.useNewCruncher = false

用来关闭Android Studio的PNG合法性检查的,直接不让它检查。

【8】Android Studio 错误: 非法字符: '\ufeff' 解决方案|错误: 需要class, interface或enum

原因:

Eclipse可以智能的把UTF-8+BOM文件转为普通的UTF-8文件,Android Studio还没有这个功能,所以使用Android Studio编译UTF-8+BOM编码的文件时会出现” 非法字符: '\ufeff' “之类的错误。

解决方法:

手动将UTF-8+BOM编码的文件转为普通的UTF-8文件。**

**用EdItPlus打开.java文件依次:文档》文本编辑》转换文本编码》选择UTF-8编码即可。

【9】修改了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’ 就是啥版本的。

【10】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
        }
        }      

【11】Android studio 编译问题:finished with non-zero exit value 1(由于导入的依赖出现重复造成的)

问题:

Error:Execution failed for task ':app:transformClassesWithDexForDebug'.
        > com.[Android](http://lib.csdn.net/base/15).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一下。

【12】问题

Error:Execution failed for task
':app:transformClassesWithJarMergingForDebug'.>
        com.android.build.api.transform.TransformException:
        java.util.zip.ZipException:
        duplicate entry: org/apache/http/ConnectionClosedException.class
      

解决方案

这个是在我们启动的时候报错的,而不是在编译的时候,原因是这样的,报这个错是因为有2个库中存在相同的类。大家可以看到stackoverflow上有人也提了这样的问题。只需要删除其中的一个就可以解决了。

【13】添加第三方依赖出现的问题

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      

错误原因

出现这个错误的原因是我引入的第三方库最低支持版本高于我的项目的最低支持版本,异常中的信息显示:我的项目的最低支持版本为14,而第三方库的最低支持版本为19,所以抛出了这个异常。

解决方案

在AndroidManifest.xml文件中标签中添加

<uses-sdk tools:overrideLibrary="xxx.xxx.xxx"/>      

其中的xxx.xxx.xxx为第三方库包名,如果存在多个库有此异常,则用逗号分割它们,例如:

<uses-sdk tools:overrideLibrary="xxx.xxx.aaa, xxx.xxx.bbb"/>      

这样做是为了项目中的AndroidManifest.xml和第三方库的AndroidManifest.xml合并时可以忽略最低版本限制。

【14】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"
        }      

【15】Android studio 编译问题:Gradle DSL not found 'android()'

问题

Android开发者珍藏必备【常见错误篇】

解决方案

配置build.gradle:

buildscript {
        repositories {
        jcenter()
        }

        dependencies {
        classpath 'com.android.tools.build:gradle:2.1.2'
        }
        }

        allprojects {
        repositories {
        jcenter()
        }
        }
        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 {
    compileSdkVersion 23
    buildToolsVersion '23.0.3'
    defaultConfig {
    minSdkVersion 9
    targetSdkVersion 23
    versionCode 1
    versionName '1.0'
    }
    }
    dependencies {
    compile 'com.android.support:appcompat-v7:23.2.1'
    }      

最后再同步一下sync即可。

【16】Android studio 编译问题:Gradle DSL not found 'android()'

问题描述

Error:(51, 52) 错误: -source 1.6 中不支持 diamond 运算符

(请使用 -source 7 或更高版本以启用 diamond 运算符)

解决方案

方案一

Android开发者珍藏必备【常见错误篇】

方案二

在build gradle中进行配置如下代码:

android {
        compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_7
        targetCompatibility JavaVersion.VERSION_1_7
        }
        }      

【17】Glide使用问题:使用Glide加载圆角图片,第一次显示占位图

问题描述

最近在项目中使用Glide加载圆形图片,并且设置placehloder和error两个占位图,运行发现,第一次加载图片只显示占位图,需要第二次进入的时候才会正常显示。

如果你刚好使用了这个圆形Imageview库或者其他的一些自定义的圆形Imageview,而你又刚好设置了占位的话,那么,你就会遇到第一个问题。如何解决呢?

方案一

不设置占位图

方案二

使用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<Bitmap>(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);      

【18】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自带的编辑器引入的。

【19】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'
    }
    }
    }      

【20】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.      
Android开发者珍藏必备【常见错误篇】

解决方案

将根目录中的build.gradle文件中的gradle版本号,出现错误之前,我的是1.3.0,修改成2.2.0之后重新编译一下就可以运行了。

dependencies {
        classpath 'com.android.tools.build:gradle:1.3.0'
        }      

将这个版本号改成你其他项目能够运行成功的版本号即可

【21】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 !

【22】Android手机真机调试,日志不打印的解决方案:

1、在拨号界面输入:*#*#2846579#*#* 进入测试菜单界面。 

2、Project Menu–后台设置–LOG设置

3、LOG开关–LOG打开 LOG级别设置–VERBOSE 

4、Dump&Log– 全部选中

5、重启手机

【23】使用友盟分享——微信、朋友圈分享出现java.lang.NoClassDefFoundError: org.apache.http.entity.mime.MultipartEntity

**

解决方案: 造成这样的原因是因为缺少httpmime_jar,添加是httpmime_jar包之后即可正常分享

【24】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 类。

解决方案

  1. 在清单文件添加如下代码
<provider
           android:name="android.support.v4.content.FileProvider"
                   android:authorities="你的应用包名.fileProvider"
                   android:exported="false"
                   android:grantUriPermissions="true">

<meta-data
        android:name="android.support.FILE_PROVIDER_PATHS"
        android:resource="@xml/provider_paths"/>

</provider>
       // android:authorities="com.alex.demo.FileProvider" 自定义的权限
       // android:exported="false" 是否设置为独立进程
       // android:grantUriPermissions="true" 是否拥有共享文件的临时权限
        //android:resource="@xml/external_storage_root" 共享文件的文件根目录,
        名字可以自定义      

2.在xml文件夹目录下新建provider_paths文件,名字自定义,添加如下代码

<?xml version="1.0" encoding="utf-8"?>
<resources>
<paths>
<external-path
        name="camera_photos"
        path="" />
</paths>
</resources>      

3.调用系统相机处代码处理

/**
 * 生成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;
        }      

【25】解决android 6.0(api 23) SDK,不再提供org.apache.http.(只保留几个类)

android {
useLibrary 'org.apache.http.legacy'
}      

【26】找不到代码仓库

AndroidStudio默认的代码仓库的位置在jcenter(),这在之前都是如此,最新的AndroidStudio使用时主要代码仓库变成了google;使用一些独有的框架时,可能在module的build.gradle中进行compile*** 时,无法获取资源,这时候需要在project 的build.gradle文件中添加上仓库路径。如图:

Android开发者珍藏必备【常见错误篇】

【27】包依赖冲突

在build.gradle中,如果依赖框架过多,则可能导致依赖冲突;简单的说就是框架A和框架B都引用了某个包(如gson),但依赖的版本等不同(如A依赖gson2.0,B依赖gson3.0),这是gradle编译就会出错,此时可以在complile中引用资源时添加规则:

compile('org.hibernate:hibernate:3.1') {
// 冲突时优先使用该版本
    force = true

    // 依据构建名称排除
    exclude module: 'cglib'
    // 依据组织名称排除
    exclude group: 'org.jmock'
    // 依据组织名称+构件名称排除
    exclude group: 'org.unwanted', module: 'iAmBuggy'

    // 为本依赖关闭依赖传递特性
    transitive = false
}      

比如,在使用PermissionDispatcher库进行全新管理时,为避免与项目原有库冲突,可以指定不依赖某个包:

//动态权限管理
compile('com.github.hotchemi:permissionsdispatcher:3.0.1') {
    exclude module: 'support-v13'
}      

持续更新中……

Android开发者珍藏必备【常见错误篇】