(可以直接快速搜索你对应的问题)以下是我开发中遇到的一些bug以及解决方法,会不定期更新!里面也包含了一些前人的博客,直接使用的是连接
问题:Failed to resolve: com.github.chrisbanes:PhotoView:1.2.6
解决方法:在项目的build.gradle添加如下:photoview的maven仓库
问题:Android Could not find method ndk
解决方法:把 ndk 放在 defaultConfig 里面
defaultConfig {
.....
ndk {
}
.....
}
问题:java.lang.AbstractMethodError: abstract method "void com.bumptech.glide.module.RegistersComponents.registerComponents(android.content.Context, com.bumptech.glide.Glide, com.bumptech.glide.Registry)" at com.bumptech.glide.Glide.initializeGlide(Glide.java:230) at com.bumptech.glide.Glide.checkAndInitializeGlide(Glide.java:171) at com.bumptech.glide.Glide.get(Glide.java:155) at com.bumptech.glide.Glide.getRetriever(Glide.java:528) at com.bumptech.glide.Glide.with(Glide.java:554)
原因:
引用了:implementation "com.github.bumptech.glide:okhttp3-integration:1.4.0@aar"
private static void initializeGlide(Context context) {
...
// 这里会得到一个 com.bumptech.glide.integration.okhttp3.OkHttpGlideModule
List<GlideModule> manifestModules = Collections.emptyList();
if (annotationGeneratedModule == null || annotationGeneratedModule.isManifestParsingEnabled()) {
manifestModules = new ManifestParser(applicationContext).parse();
}
// 这里报错。因为OkHttpGlideModule继承了GlideModule,但是没有实现void registerComponents(Context context, Glide glide, Registry registry);方法,所以报错
for (GlideModule module : manifestModules) {
module.applyOptions(applicationContext, builder);
}
...
}
解决方法:删掉okhttp3-integration或者升级(我是删掉就行了,搞了我半天。。。)
问题:引入jar文件、so文件、arr文件
解决方法:第一种:在main下面新建jniLibs并把.so文件复制到该目录下,并把jar放在lib目录下并添加到项目中。
第二种方法:jar包和so文件都放在libs目录下。
//libs中的jar文件或者so文件
在android中添加:
android{
repositories {
flatDir {
dirs 'libs'
}
}
sourceSets.main {
jni.srcDirs = []
jniLibs.srcDir "libs"
}
}
在dependencies 中添加:
dependencies {
compile(name: 'XXXX', ext: 'aar')//XXXX就是你的arr文件的名字
}
问题:gradle中使用了不同的version版本(all com.android.support libraries must use the exact same version specification)
解决方法:
configurations.all {
resolutionStrategy.eachDependency { DependencyResolveDetails details ->
def requested = details.requested
if (requested.group == 'com.android.support') {
if (!requested.name.startsWith("multidex")) {
details.useVersion '24.2.1'
}
}
}
}
问题:设置scrollview的scrollto方法无效,即使在onWindowFocusChanged方法中使用也无效
解决方法:使用延时调用就可以解决,我理解为可能界面没加载完全,scrollview无法滚动
问题:魅族手机(魅蓝note)无法作为调试设备连接到mac问题的解决(http://www.cnblogs.com/kristain/articles/4685591.html)
解决方法:mac os 系统中无法被识别,在命令行输入 system_profiler SPUSBDataType在, 然后将魅蓝note的vendor id 添加至 ~/.android/adb_usb.ini文件中,然后依次执行adb kill-server adb start-server即可进入adb shell。
问题:java.lang.UnsatisfiedLinkError: dlopen failed: cannot locate symbol "strtof" referenced by "libsupportjni.so"...
解决方法: Run -> Edit Configurations -> Profiling 中 "Enable advanced profiling(required for API level < 26 only)" 这个选项的勾勾去掉
问题:解决Android Webview 加载一些网页出现白板现象
解决方法:原因是webview配置不全,主要是setDomStorageEnabled属性没有设置http://blog.csdn.net/qduningning/article/details/43411765
问题:.ClassNotFoundException
问题描述:模拟器和高android系统不崩,直邮android4.4运行就崩溃
解决方法:http://www.itdadao.com/articles/c15a298843p0.html,
在application中重写
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
MultiDex.install(this);
}
问题:.gradle打包,自定义apk名称代码报错(Cannot set the value of read-only property ‘outputFile’ )
Error:(56, 0) Cannot set the value of read-only property ‘outputFile’ for ApkVariantOutputImpl_Decorated{apkData=Main{type=MAIN, fullName=debug, filters=[]}} of type com.android.build.gradle.internal.api.ApkVariantOutputImpl.
备注:android studio 3.0多包一起打
http://blog.csdn.net/u014300915/article/details/78355420
解决方法:将原在build.gradle中的配置改为
flavorDimensions 'api'
productFlavors.all { flavor ->
flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name]
}
android.applicationVariants.all { variant ->
variant.outputs.all {
outputFileName = "应用名称_${variant.productFlavors[0].name}_v${variant.versionName}.apk"
}
}
问题:打包打开混淆久报错不能打包,取消混淆就可以成功
报:Error:Execution failed for task ':app:transformClassesAndResourcesWithProgua
解决方法:找到jar包的对应混淆配置,以下是基本的混淆配置
-ignorewarnings # 抑制警告
-keepattributes *JavascriptInterface*
#指定代码的压缩级别
-optimizationpasses 5
#表示混淆时不使用大小写混合类名,混淆后的类名为小写
-dontusemixedcaseclassnames
#混淆第三方库,加上此句后可在后面配置某些库不被混淆
-dontskipnonpubliclibraryclasses
#表示不进行优化,建议使用此选项,因为根据proguard-android-optimize.txt中的描述,优化可能会造成一些潜在风险,不能保证在所有版本的Dalvik上都正常运行。
-dontoptimize
#表示不进行预校验,可以加快混淆速度。预校验是作用在Java平台上的,Android平台上不需要这项功能
-dontpreverify
# 混淆时输出日志
-verbose
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/* #混淆时所采用的算法,一般不改变,用谷歌推荐算即可
问题:Gradle sync failed: Cause: com.android.build.gradle.api.BaseVariant.getOutputs()Ljava/util/List
解决方法:http://blog.csdn.net/yechaoa/article/details/78363911
问题:umeng分享微博未安装应用跳转网页分享(java.lang.RuntimeException: 缺少资源文件:packageName=com.changdao.ttsing type=style name=umeng_socialize_popup_dialog请去sdk下载包中拷贝)
解决方法:去找res/values/umeng_socialize_style.xml
问题:BitmapFactory.decodeResource为null的处理方法之一
问题代码:
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.danger_build10);
其中R.drawable.danger_build10是一个vector图片,此代码在4.4上运行正常,但在5.0以上的系统会出现空指针,原因在于此本来方法不能将vector转化为bitmap,而apk编译时为了向下兼容,会根据vector生产相应的png,而4.4的系统运行此代码时其实用的是png资源。这就是为什么5.0以上会报错,而4.4不会的原因
解决方法:
private static Bitmap getBitmap(Context context,int vectorDrawableId) {
Bitmap bitmap=null;
if (Build.VERSION.SDK_INT>Build.VERSION_CODES.LOLLIPOP){
Drawable vectorDrawable = context.getDrawable(vectorDrawableId);
bitmap = Bitmap.createBitmap(vectorDrawable.getIntrinsicWidth(),
vectorDrawable.getIntrinsicHeight(), Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(bitmap);
vectorDrawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());
vectorDrawable.draw(canvas);
}else {
bitmap = BitmapFactory.decodeResource(context.getResources(), vectorDrawableId);
}
return bitmap;
}
问题:升级安装APK兼容Android7.0,解决FileUriExposedException
解决方法:http://blog.csdn.net/ruancoder/article/details/67639621
问题:Error:All flavors must now belong to a named flavor dimension. Learn more at https://d.android.com/r
解决方法:在app的build.gradle中添加flavorDimensions "versionCode"
问题:error: style attribute '@android:attr/windowEnterAnimation' not found
解决方法:在Project/gradle.properties中添加 android.enableAapt2=false
问题:android动态设置view背景透明的问题
问题描述:view.getBackground().setAlpha(100)(alpha值0-255);在小米手机上出现设置了view 的background透明度,但是整个应用的background都会有透明度
解决方法:方法改为:titleLayout.getBackground().mutate().setAlpha(255);
在布局中多个控件同时使用一个资源的时候,这些控件会共用一个状态,例如ColorState,如果你改变了一个控件的状态,其他的控件都会接收到相同的通知。这时我们可以使用mutate()方法使该控件状态不定,这样不定状态的控件就不会共享自己的状态了。
(引用自http://blog.csdn.net/myatlantis/article/details/49336587)
问题:状态栏透明
解决方法:
第一步://直接将下面的代码放在activity中的setContentView(R.layout.activity_main);中之前就行了
if (Build.VERSION.SDK_INT >= 21) {
View decorView = getWindow().getDecorView();
decorView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
getWindow().setStatusBarColor(Color.TRANSPARENT);
}
或者:getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
第二步:android:fitsSystemWindows="true"//这句代码是控制不让toolbar和状态栏重叠
问题:解决Error:Unable to find method 'org.gradle.api.internal.project.ProjectInternal.g
解决方法:差异一:gradle版本太低
差异二:gradle-wrapper.properties里面的gradle压缩包版本太低
http://blog.csdn.net/ouyang_peng/article/details/52027668
问题:org.greenrobot.greendao.DaoException: Expected unique result, but count was 2
解决方法:数据库有多条数据,但是你却使用queryBuilder.unique()想获得唯一的一条数据,所以就会报错
问题:ScrollView嵌套ListView默认位置不是最顶部的解决方案
解决方法:http://blog.csdn.net/kentlee114/article/details/54173504(亲测试在代码里去掉listview的焦点lv.setFocusable(false)有效)
问题:保存图片和视频在相册直接可以显示
原因分析:有时设置保存路径是在应用包下,图片或视频明明在却在相册中无显示。那是因为保存路径设置不对。(可以自定义不同保存路径看看效果)
解决方法:Environment.getExternalStorageDirectory() + File.separator+ "DCIM/Camera/";这样设置路径,可以直接显示在手机相册中。别忘了发广播通知相册刷新。
问题:使用自定义的viewpager时出现Caused by: java.lang.IllegalArgumentException: Wrong state class, expecting View State but received class XXXX$SavedState instead. This usually happens when two views of different type have the same id in the same hierarchy.
解决方法:
默认:
@Override
protected void onRestoreInstanceState(Parcelable state) {
super.onRestoreInstanceState(state); }
修改为:
@Override
protected void onRestoreInstanceState(Parcelable state) {
try {
super.onRestoreInstanceState(state);
}catch (Exception e) {}
state=null;
}
问题:ScrollView 嵌套内容不显示问题
解决方法:在ScrollView中添加一个android:fillViewport="true"属性就可以了。顾名思义,这个属性允许ScrollView中的组件去充满它。
问题:ViewPager切换时为什么会自动跳到recyclerView或者listview的位置
解决方法:第一种:在listview或者recyclerView添加属性android:focusableInTouchMode="true"
第二种:在其父布局中添加android:descendantFocusability="blocksDescendants"
问题:使用MediaRecorder时报错:android.media.MediaRecorder.stop(Native Method)
解决方法:
try {
mediaRecorder.stop();
} catch (RuntimeException e) {
mediaRecorder = null;
mediaRecorder = new MediaRecorder();
}
问题:使用MediaRecorder第二次录音会崩溃
解决方法:MediaRecorder不可以使用单例一次设置配置,比如:setAudioSource、setOutputFormat、setAudioEncoder等
需要每次都new MediaRecorder(),然后设置配置
问题:ListView顶部或者底部也显示分割线
解决方法:
添加头分割线:listView.addHeaderView(new ViewStub(this));
添加底分割线:listView.addFooterView(new ViewStub(this));
属性添加android:headerDividersEnabled、android:footerDividersEnabled,这两个属性添加分割线listView必须有头布局和底布局分割线才会显示。
问题:git冲突(git拉取代码冲突)
解决方法:依次运行以下三个方法
git stashgit pullgit stash pop
解决方法:
注意⚠️:getDecorView() 获取的是整个应用的view 包括标题栏,但是不包括状态栏,r.top就是状态栏的高度。
第一步:et.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener(){ //当键盘弹出隐藏的时候会 调用此方法。 @Override public void onGlobalLayout() { Rect r = new Rect(); //获取当前界面可视部分 MainActivity.this.getWindow().getDecorView().getWindowVisibleDisplayFrame(r); //获取屏幕的高度 int screenHeight = MainActivity.this.getWindow().getDecorView().getRootView().getHeight(); //此处就是用来获取键盘的高度的, 在键盘没有弹出的时候 此高度为0 键盘弹出的时候为一个正数 int heightDifference = screenHeight - r.bottom; Log.d("Keyboard Size", "Size: " + heightDifference); } });
第二步:AndroidManifest中配置:对应Activity配置:
android:windowSoftInputMode="stateAlwaysHidden"
问题:Android 之冷启动优化(解决启动短暂白屏or黑屏,启动白屏)
解决方法:
第一步、创建style
<style name="AppTransparentTheme" parent="Theme.AppCompat.Light.NoActionBar"> <item name="android:windowIsTranslucent">true</item> <item name="android:windowBackground">@android:color/transparent</item> </style>
第二部、启动的Activity中主题设置为以上Style
问题:MediaPlayer中onCompletion和onError的坑(上一首切换结果回调onCompletion)
解决方法:
原因:MediaPlayer的OnErrorListener时就在调用onError方法,error没有被处理,即没有设置错误监听或者onError方法返回false(通过log验证结论),就调用OnCompletionListener的onCompletion方法。
解决方法:设置OnErrorListener监听,返回值改为true,链接:https://blog.csdn.net/wgheng2011/article/details/72725381
问题:异常:Unknown features (Run Configuration[AndroidRunConfigurationType], Facet[android, android-gradle])
解决方法:链接:https://blog.csdn.net/qq_25404567/article/details/72868626
在setting——>Plugins你会发现里面有些插件是红的,找到Android Support重新点击选择后,重新启动Studio就好了。
问题:Cause:Write access is allowed from event dispatch thread only
解决方法:在studio中File -> Project Structure -> SDK Location勾选“Use embedded JDK”,然后点击OK即可
问题:Error:null value in entry: aaptFriendlyManifestOutputFile=null
解决方法:直接删除根目录的.gradle文件夹,重新编译一下就可以了
问题:Android Webview播放视频时,退出Activity 后,还有播放声音的解决方法
解决方法:在onPause方法中调用h5WebView.reload();有效;
可以在onDestroy方法中多添几行代码:
h5WebView.destroy();
h5WebView = null;
问题:DSL element 'DexOptions.incremental' is obsolete and will be removed at the end of 2018.
解决方法:
//在build.gradle文件中找incremental;incremental dexing,优化编译效率,incremental这个将在2018年后被弃用
dexOptions {
incremental true//删除这行代码即可
javaMaxHeapSize "4g"
}
可以加群:964138991,我们一起讨论技术相关问题,遇到问题也可以在群里询问,大家帮忙解决;