targetSdkVersion升级到28问题

错误1: java.io.IOException: Cleartext HTTP traffic to 包名 not permitted
原因分析:
从Android 6.0开始引入了对Https的推荐支持,与以往不同,Android P的系统上面默认所有Http的请求都被阻止了。

<application android:usesCleartextTraffic=["true" | "false"]>

原本这个属性的默认值从true改变为false
解决办法:
AnroidManifest.xml中的application显示设置

<application android:usesCleartextTraffic="true">

更为根本的解决办法是修改应用程序中Http的请求为Https,当然这也需要服务端的支持。

错误2: 在8.0之后前台服务使用startForegroundService()启动,需要权限

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

错误3:android 8.0 报错StartForeground Bad Notification Error 解决方法
在android8.0后 需要给notification设置一个channelid

public final static String channelName="cn.george.app";

mNotificationManager.createNotificationChannel(
new NotificationChannel(channelName,
"Channel One",
NotificationManager.IMPORTANCE_HIGH));

NotificationCompat.Builder builder = 
new NotificationCompat.Builder(this,channelName)
                .setContent(remoteViews)
                .setSmallIcon(R.mipmap.pic);

错误4:Android 8.0.0错误:Only fullscreen opaque activities can request orientation
原因:对activity的theme设置了

<--这个属性true不能和这个Activity指定屏幕方向同时使用-->
<item name="android:windowIsTranslucent">true</item>

8.0.0源码中

if (isTranslucentOrFloating) {
                throw new IllegalStateException(
                        "Only fullscreen opaque activities can request orientation");
            }

抛出了异常,会在8.0.0手机出现闪退,在8.0.0之后的版本8.0.1做了处理。
解决办法,item改为

如果非要使用这个属性true,那就不要指定屏幕的方向
<item name="android:windowIsTranslucent">false</item>

错误5:android.support.v4.app.Fragment.setMenuVisibility(boolean)' on a null object reference
android.support.v4.app.FragmentPagerAdapter.setPrimaryItem(Unknown Source:23)
原因:
在api25的时候:

@Override
    public void setPrimaryItem(ViewGroup container, int position, Object object) {
        Fragment fragment = (Fragment)object;
        if (fragment != mCurrentPrimaryItem) {
            if (mCurrentPrimaryItem != null) {
                mCurrentPrimaryItem.setMenuVisibility(false);
                mCurrentPrimaryItem.setUserVisibleHint(false);
            }
            if (fragment != null) {
                fragment.setMenuVisibility(true);
                fragment.setUserVisibleHint(true);
            }
            mCurrentPrimaryItem = fragment;
        }
    }

在api28的时候

public void setPrimaryItem(@NonNull ViewGroup container, int position, @NonNull Object object) {
        this.setPrimaryItem((View)container, position, object);
    }

发现28的时候object标记了@NoNull不能为null。则否则null异常。
所以不能传null。

推荐阅读更多精彩内容