Android8.0に遭遇したピット

2493 ワード

最近、プロジェクトの必要性をためらって、targetSDKVersionを26にアップグレードする必要があります.コードでできたことだと思っていましたが、テストで発見された2つの穴がありました.
一:システム弾窓(懸濁窓)が発効しない
プロジェクトにSYSTEMを使用しましたALERT_WINDOW権限弾きましたサービスにdialogをセットしたTYPE_SYSTEM_ALERTのサスペンション窓、使いにくいことに気づきました.解決策:
アプリケーションがSYSTEM_ALERT_WINDOW権限を使用し、次のいずれかのウィンドウタイプを使用しようとすると、他のアプリケーションおよびシステムウィンドウの上にアラートウィンドウが表示されます.
  • TYPE_PHONE
  • TYPE_PRIORITY_PHONE
  • TYPE_SYSTEM_ALERT
  • TYPE_SYSTEM_OVERLAY
  • TYPE_SYSTEM_ERROR

  • どうぞTYPE_APPLICATION_OVERLAY
    置換
    dialog.getWindow().setType((WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY));

    二:通知が発効しない
    プロジェクトには通知通知が使われており、昇格後8.0の機械でも使いにくくなっています.APIを調べてみると、元の
    new NotificationCompat.Builder(this)  8.0     ,     new NotificationCompat.Builder(this,String channelId)
     channelId     :
     
      
    String id = "channel_1";
    String description = "123";
    int importance = NotificationManager.IMPORTANCE_LOW;
    NotificationChannel mChannel = new NotificationChannel(id, "123", importance);
      mChannel.setDescription(description);
      mChannel.enableLights(true);
      mChannel.setLightColor(Color.BLUE);
      mChannel.enableVibration(true);
      mChannel.setVibrationPattern(new long[]{100, 200, 300, 400, 500, 400, 300, 200, 400});
    notificationManager.createNotificationChannel(mChannel);
    channelを生成しない場合は、idを直接入力しても有効ではありません.
    だから26の学友まで8.0の机种に适合する时必ずこの2つの问题に注意して、
    if(Build.VERSION.SDK_INT>=26){}else{}
    は、それぞれ設定されていると判断する.