Android开发,我踩过的坑

1、intent传值问题:

intent使用 putExtra 方法传入一个int型值,然后取出来的时候使用了取字符串的方法 getStringExtra ,结果取出来的是null,我开始误以为会自动将 int 转成字符串格式,所以以后还是得注意格式。

2、在Android Studio 3.0 Canary 3上面打开一个之前的项目,出现了Activity类型实例this,赋值给Context类型变量出错的提示:

Context ctx = this;  //通过修改compileSdkVersion 版本为25(之前是24), 然后修改对应的appcompat-v7版本为25.3.1(之前是24.1.0)之后解决了错误提示.

3、接入第三方登录(如QQ、微信、微博等)时,一定要注意关闭网络的代理配置,否则就会出现各种错误。

经验:遇到奇怪的问题的时候(检查过一遍代码之后或bug没有头绪的时候),首先应该检查网络状况,其次是对多种手机型号对比,最后再进一步审查代码逻辑。

4、使用glide加载图片失真,特别是图片中纯色部分会花掉,网上有一些文章建议修改glide加载图片的格式为ARGB8888,但是并没有解决我的问题,后来我修改DiskCacheStrategy缓存模式为“SOURCE”就好了。

5、使用shape资源时,我们常常是作为通用资源,被多个控件使用,当我们使用Java代码

GradientDrawable drawable = (GradientDrawable) view.getBackground();
drawable.setColor(bgColor);

来修改某个控件的背景shape资源的时候,就会造成其他使用该shape资源的控件的背景一同被修改掉,所以,用Java代码修改shape资源时要慎重,确保不会影响到其他控件,否则专门创建一个shape资源来使用。

6、谨慎使用str.split("|");这样会将字符串单个切割成字符串数组,例如:“abc”.split("|") => {"a","b","c"},所以,需要根据字符串中的"|"符号切割时,可以先str.replace("|", ",");转换成逗号,然后str.split(",")即可。

7、微信分享的坑,今天突然出现分享出去的链接在微信里面打开报错“appid不能为空,错误码:10012”,原因居然是微信测试后台挂掉了,造成app获取不到appid。

8、某天打开项目突然提示https://jcenter.bintray.com/org/apache/httpcomponents/httpclient/4.2.6/httpclient-4.2.6.jar 下载不了,后台我删掉原gradle缓存目录.gradle\caches\modules-2\files-2.1\org.apache.httpcomponents\httpclient\4.2.6\下面的文件,并修改AS的gradle配置项(选中use local gradle distribution选项,去掉 Offline work选项),然后重新运行就好了。

9、短信分享被google play保护机制报警,提示用户有可能恶意扣费,代码如下:

Object[] info = Utils.readSIMCard(act);
if (info != null && !Boolean.parseBoolean(info[0].toString())) {
    if (info[1] != null) {
        String strInfo = info[1].toString();
        ToastUtil.show(MyApplication.getInstance().getApplicationContext(), strInfo);
    }
    return;
}
try {
    Intent sendIntent;
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { //api19之后的调用
        String defaultSmsPackageName = Telephony.Sms.getDefaultSmsPackage(act); //Need to change the build to API 19
        sendIntent = new Intent(Intent.ACTION_SEND);
        sendIntent.setData(Uri.parse("smsto:"));
        sendIntent.setType("text/plain");
        sendIntent.putExtra(Intent.EXTRA_TEXT, content.shareText
                + (ABTextUtil.isBlank(content.shareUrl) ? "" : "\n" + content.shareUrl));
        if (defaultSmsPackageName != null){
            sendIntent.setPackage(defaultSmsPackageName);
        }
    }else{
        sendIntent = new Intent(Intent.ACTION_VIEW);
        sendIntent.setType("vnd.android-dir/mms-sms");
    }
    sendIntent.putExtra("sms_body", content.shareText
            + (ABTextUtil.isBlank(content.shareUrl) ? "" : "\n" + content.shareUrl));
    act.startActivity(sendIntent);
} catch (Exception e) {
    ToastUtil.show(act.getApplicationContext(), "唤起短信失败!");
}

10、glide的问题,使用glide.with(context).load(Object)方法要特别注意,不要把数据的model传进去了,否则会报异常:glide.Registry$NoModelLoaderAvailableException: Failed to find any ModelLoaders for model: 

11、极光推送厂商系统要求:
miui全系统支持;color3.1以上;funtouch 3.1以上;emui4.1以上,在emui5.1以上支持的较好;flyme5.1.1.11.1以上,在flyme6.1以上支持的较好。

12、高德地图的步行线路绘制,在路线最后添加虚线路径。找到官方demo项目中的类WalkRouteOverlay的addToMap()方法,添加代码:

try {
            List<WalkStep> walkPaths = walkPath.getSteps();
            LatLng latLng = null;
            for (int i = 0; i < walkPaths.size(); i++) {
                WalkStep walkStep = walkPaths.get(i);
                latLng = AMapServicesUtil.convertToLatLng(walkStep
                        .getPolyline().get(0));
                
				addWalkStationMarkers(walkStep, latLng);
                addWalkPolyLines(walkStep);
               if(i == walkPaths.size() - 1){ //获取路线上最后一个点的经纬度
                   List<LatLonPoint> llpoints = walkStep.getPolyline();
                   if(llpoints != null && llpoints.size() > 0){
                       latLng = AMapServicesUtil.convertToLatLng(llpoints.get(llpoints.size() -1));
                   }
               }
            }
            addStartAndEndMarker();
            showPolyline();
            //添加结束点
            if(latLng != null ){
//                    && AMapUtils.calculateLineDistance(latLng, endPoint) > 1){
                PolylineOptions mPolylineOptionsEnd = new PolylineOptions();
                mPolylineOptionsEnd.color(getWalkColor()).width(getRouteWidth());
                mPolylineOptionsEnd.setDottedLine(true);
                mPolylineOptionsEnd.add(latLng);
                mPolylineOptionsEnd.add(endPoint);
                //添加结束点虚线
                addPolyLine(mPolylineOptionsEnd);
            }
        } catch (Throwable e) {
            e.printStackTrace();
        }

13、同一个项目两次打包成apk文件,其中的签名文件MANIFEST.MF的差异性说明:

1)使用jarsigner 命令签名和使用AS开发工具打包出来的apk文件中的MANIFEST.MF不同。

2)同样的项目代码,在不同文件目录下打包出来的apk文件中的MANIFEST.MF不同。例如:把项目从A目录拷贝到B目录,那么A目录打包出来的apk和B目录打包出来的apk文件中的MANIFEST.MF不同。

14、webview出现突然某个域名所有的H5网页打不开了,其他手机(包括同型号的手机)都能正常打开网页,只有这一台手机显示空白,那么极有可能是缓存原因造成的,可以试试去手机设置中清理应用缓存,清理完之后再打开应该就好了。

15、用imageview作为布局背景,结果背景显示的总是宽高少一点,不能完全填满背景区域,代码调了半天,结果发现是设计切图的坑,设计切图时,在图片内容外面留了一圈透明区域,结果我以为是代码的问题,浪费我时间,太坑了。

16、使用recycleview,在 onCreateViewHolder()中创建view时,

 new ViewHolder(new ImageView)  和

 new ViewHolder(LayoutInflater.from( parent.getContext()).inflate(R.layout.item_layout, parent, false))这两种方式加载view有所不同,会影响view的布局宽高效果。

17、小米应用商店在下载app的时候老是提示有扩展插件,是因为上线app包时,小米商店后台配置的问题,去掉应用扩展的配置即可。

18、imageview中的adjustViewBounds和fitcenter的设置,对图片的缩放效果差不多,但是在通过include或ViewStub方式引用子布局加载图片时,宽高的计算效果有所不同,fitcenter会把wrap_content的高度计算成match_parent

19、低版本系统中,EditText 输入框里面的文字看不见了,原因是
typedArray.getColor(R.styleable.CustomViewStyle_editTextColor, ContextCompat.getColor(mContext, R.color.RED))

返回的值与高版本不同,xml没有配置editTextColor时,高版本返回RED颜色,低版本(oppor7c Andorid4.4.4)返回-1

20、Android的webview加载网页报“证书不可信或已过期”,即证书验证方法onReceivedSslError()被调用,客户端排查方案:

  • 检查手机的日期是否正常,可能测试的时候把日期时间改掉了,错误的日期可能会造成证书校验失败;
  • 检查手机网络是否开了代理,开启代理会造成证书校验失败;
  • 检查手机WiFi网络是否正常,建议使用4G网络试试,如果是连接的网络不正常,比如公司的内网,也有可能造成证书校验失败。

21、下载腾讯的插件化框架demo,Android studio加载Shadow-master出现错误,语句 DocumentBuilderFactory.newDefaultInstance() 编译不通过:Unresolved reference: newDefaultInstance

原因是jdk版本过低的问题,我的解决方法:将Android studio的gradle中jdk版本从原来的1.8修改成11之后就好了。

22、使用kotlin协程配合retrofit2做网络请求操作时,报错:

java.lang.IllegalArgumentException: No Retrofit annotation found. (parameter #2)

原因:

(1)在接口中定义请求方法时,忘记在参数前面添加对应的注解了,例如:

//getTestData中参数body前面的注解@Body忘记写了
@POST("server/test")
suspend fun getTestData(@Body body: RequestBody): BaseResult<String>

(2)retrofit2的版本问题,我这边使用“2.5.0”版本时就出现“No Retrofit annotation found”这个错误了,后面我更新了retrofit2的版本为“2.6.2”之后就没问题了。

//将原来的2.5.0版本修改为2.6.2之后就没问题了
implementation 'com.squareup.retrofit2:retrofit:2.6.2'
implementation 'com.squareup.retrofit2:converter-gson:2.6.2'

23、Android studio的build apk时,出现一个奇怪的错误提示: MaterialComtonents.PopupMenu.Overflow) not found

build.gradle中主要的配置如下:

//gradle版本是7.1.3   kotlin版本是1.6.21 ,主app下的gradle配置如下:
android {
    compileSdk 32
    defaultConfig {
        applicationId "com.xyz"
        minSdk 16
        targetSdk 32
        versionCode 1
        versionName "1.0"

        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }
}

dependencies {
    implementation 'androidx.core:core-ktx:1.7.0'
    implementation 'androidx.appcompat:appcompat:1.3.0'
//    implementation 'com.google.android.material:material:1.6.1'
    implementation 'com.google.android.material:material:1.4.0'
    implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
}

说明:后面我把 material:1.4.0' 改成 material:1.6.1' 之后再build就成功了,最奇怪的是,我再次改回1.4.0之后,也build成功了,错误莫名其妙就没有了,仅仅只是版本变更了一次。猜测可能是之前缓存的1.4.0版本中的数据有问题?后面重新改回1.4.0之后,把数据更新了,然后就没问题了

24、android studio启动报错:Missing essential plugin: xxx Please reinstall Android Studio from scratch.
解决方法:删掉文件 C:\Users\Administrator\AppData\Roaming\Google\AndroidStudio.x\disabled_plugins.txt 中对应报错的内容,例如,我这边删除 org.jetbrains.kotlin 就好了;目录中AndroidStudio.x对应你使用android studio版本。如果上面的方式不行,建议删掉C:\Users\Administrator\AppData\Roaming\JetBrains文件夹试一试。

25、直接使用adb安装系统应用时,可能会报错:

(1)INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES;

排查:需要检查你的apk打包的签名证书是否正确,需与设备已安装同包名应用的证书配置一致;

(2)INSTALL_FAILED_SHARED_USER_INCOMPATIBLE;

排查:检查你的apk中AndroidManifest.xml里面的android:sharedUserId="android.uid.system"配置项,与设备已安装同包名应用的sharedUserId配置保持一致;

(3)如果上面检查都没有问题,还是不能安装,建议尝试使用adb强制安装:

adb install -r -d xxx.apk;或者先使用卸载命令:adb uninstall com.x.y.z,然后再安装;

(4)如果自己想恢复系统应用版本,可以使用卸载命令:adb uninstall com.x.y.z 把自己安装的调试应用卸载,然后重启设备,设备会自动恢复系统应用。

26、ConstraintLayout布局下面使用Scrollview时,出现无法正常滑动的问题,解决方法:把高度改成 android:layout_height="0dp" 即可。注意设置好高度的约束条件。

27、使用老版本support库的android.support.v7.widget.RecyclerView滑动时,出现item中TextView显示文本重叠拖影。

解决方法:最简单的解决方式是,给RecyclerView的父布局设置一个背景颜色即可,如android:background="@color/black"。

如果布局不能设置背景色,需要透明背景,可以按照如下思路来处理:

(1)给item设置setWillNotDraw(false)来触发ondraw绘制;

(2)在TextView的onDraw里面清空画布;

(3)设置window为透明。

参考文章:Android setText 出现文本重叠的问题_岳锋的博客-CSDN博客

28、Mac开代理之后,导致使用android studio无法正常下载gradle或者更新依赖库,报错:“you have jvm property "https.proxyhost" set to 127.0.0.1   ...”

解决:关闭代理软件,并执行命令:

pkill -f '.*GradleDaemon.*'

然后彻底退出android studio,再重新打开即可(亲测可行)。

其他方案:

1、使用离线gradle,具体步骤参考: https://blog.csdn.net/guangdeshishe/article/details/111503153

2、修改gradle的全局配置,参考:You have JVM property “https.proxyHost“ set to “127.0.0.1“ 警告问题解决_ToSimpleL的博客-CSDN博客

29、使用androidx库偶现报错:java.lang.IllegalStateException: You need to use a Theme.AppCompat theme

 解决:说是我的Activity继承自androidx.appcompat.app.AppCompatActivity,因此我的主题也应当使用兼容版本Theme.AppCompat.xxx(如:Theme.AppCompat.NoActionBar或Theme.AppCompat.Light.NoActionBar),但是我的主题本来就是设置的Theme.AppCompat.Light.NoActionBar,后面我卸载程序并重新打包安装就没有报错了,神奇了。。。

30、Android studio新建项目,发现在xml布局文件中没有代码提示了,问题原因是项目的编译版本太高了,例如:34。

解决:在build.gradle文件中降低编译版本即可,例如,把编译版本降低到29。

31、使用 <include layout="@layout/layout_item_info" style="@style/ItemStyle"/> 标签引入布局时,发现部分属性失败。

原因:在include标签中可以覆盖引入的根布局中任何 android:layout_xxx属性,但是必须先覆盖android:layout_heightandroid:layout_width,并且注意,include标签中无法覆盖android:xxx开头的属性,只能去根布局里面设置。

解决:可以直接去引入的布局里面设置根布局的属性。

32、从网站github下载一个老的项目,我直接修改了gradle配置为新版本8.0.2,但是报错:The specified Gradle installation directory 'G:\xxx\AndroidStudio2022.2.1.20\android-studio\gradle\gradle-2.10' does not exist.

解决:打开Android studio的File->Build,Execution,Deployment->Build Tools->Gradle->把Use Gradle from那里改成:'gradle-wrapper.properties' file

33、Android studio中移除部分导入的子项目,但是Run configrations下面还是会显示(图标上带红色的叉叉),怎么删除无用的项目?

点击AS的edit configrations...选项,然后在打开的窗口,点击左上角的 “-” 减号,即可删除相应的项目,如下:

34、从同事那边拿来一台Android设备调试,遇到okhttp的请求一直报错:

java.net.SocketTimeoutException: failed to connect to /192.168.3.209 (port 8888) after 5000ms
        at libcore.io.IoBridge.connectErrno(IoBridge.java:184)
        at libcore.io.IoBridge.connect(IoBridge.java:122)
        at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:183)
        at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:456)
        at java.net.Socket.connect(Socket.java:913)
        at okhttp3.internal.platform.AndroidPlatform.connectSocket(AndroidPlatform.java:73)
        at okhttp3.internal.connection.RealConnection.connectSocket(RealConnection.java:247)
        at okhttp3.internal.connection.RealConnection.connect(RealConnection.java:167)
        at okhttp3.internal.connection.StreamAllocation.findConnection(StreamAllocation.java:258)
        at okhttp3.internal.connection.StreamAllocation.findHealthyConnection(StreamAllocation.java:135)
        at okhttp3.internal.connection.StreamAllocation.newStream(StreamAllocation.java:114)
        at okhttp3.internal.connection.ConnectInterceptor.intercept(ConnectInterceptor.java:42)
        at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:147)
        at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:121)
        at okhttp3.internal.cache.CacheInterceptor.intercept(CacheInterceptor.java:93)
        at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:147)
        at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:121)
        at okhttp3.internal.http.BridgeInterceptor.intercept(BridgeInterceptor.java:93)
        at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:147)
        at okhttp3.internal.http.RetryAndFollowUpInterceptor.intercept(RetryAndFollowUpInterceptor.java:127)
        at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:147)
        at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:121)
        at okhttp3.RealCall.getResponseWithInterceptorChain(RealCall.java:257)
        at okhttp3.RealCall.execute(RealCall.java:93)
        at com.konka.data.manager.DataManager.getTrueBussinessDataByOkHttp_8(DataManager.java:2849)
        at com.konka.data.manager.DataManager.getBussinessDataByOkHttp_8(DataManager.java:2813)
        at com.konka.data.manager.DataManager.access$300(DataManager.java:154)
        at com.konka.data.manager.DataManager$1.run(DataManager.java:427)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
        at java.lang.Thread.run(Thread.java:818)

解决:查了okhttp的超时设置(connectTimeout  、readTimeout  、writeTimeout)都是10秒,并且拿其他正常设备验证了服务器的接口没有超时,也查了wifi没有问题,最后检查了代理设置,发现是其他同事设置了代理导致的问题,去掉代理配置就好了。

35、注意使用16进制整型常量定义颜色值时,要使用8位数字,不能使用6位。例如:

正确定义颜色值:
private static final int COLOR_BATTERY = 0xFF50565d;

错误的方式:

private static final int COLOR_BATTERY = 0x50565d;

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值