android开发bug解决方法或者studio使用问题汇总

(可以直接快速搜索你对应的问题)以下是我开发中遇到的一些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

问题:Android监听键盘是否弹出,以及获取软键盘的高度

解决方法:

注意⚠️: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,我们一起讨论技术相关问题,遇到问题也可以在群里询问,大家帮忙解决;

 

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值