Android Api(Okhttps)未在android 9(pie)及更高版本中调用[重复]

Posted

技术标签:

【中文标题】Android Api(Okhttps)未在android 9(pie)及更高版本中调用[重复]【英文标题】:Android Api (Okhttps) not getting called in android 9(pie) and above [duplicate] 【发布时间】:2019-09-27 22:45:25 【问题描述】:

我以与其他手机版本相同的方式调用 android API,并且在 Oreo 版本(即 8)之前它工作正常。但在 android 9 (即 pie 版本及更高版本)中没有调用 API。如果馅饼有一些变化,请告诉我。提前致谢。

 private void getLoginAPI(String username, String password, String compnaycoce) 

    if (NetworkStatus.isNetworkConnected(this)) 
        LoginReqBean bean = new LoginReqBean();
        bean.UserId = username;
        bean.Password = password;
        bean.Company = compnaycoce;
        NetworkService serviceCall = new NetworkService(Constants.loginPost(), Constants.TAG_POST, this);
        serviceCall.call(bean);
     else
        Toast.makeText(this, "Please check Internet connection", Toast.LENGTH_SHORT).show();


@Override
public void onNetworkCallInitiated(String service) 
    progressDialog = ProgressDialog.show(LoginActivity.this, "Info", "Validating Credentials, Please wait...");
    progressDialog.show();



 @Override
  public void onNetworkCallCompleted(String service, String response) 
    Log.e("LOGIN JSON ", "login " + response);

    if (progressDialog != null && progressDialog.isShowing())
        progressDialog.dismiss();

    LoginParentBean parentBean = LoginParentBean.fromJson(response);

    if (parentBean != null && parentBean.status) 
        LoginBean loginBean = parentBean.result;
        Toast.makeText(getApplicationContext(), "You Are logged in Successfully!", Toast.LENGTH_LONG).show();
        AppPreferences.INSTANCE.setUserID(loginBean.user_id);
        AppPreferences.INSTANCE.setUserRole(loginBean.userRole);
        AppPreferences.INSTANCE.setUserLocation(loginBean.location);
        AppPreferences.INSTANCE.setUserLocationID(loginBean.locationId);
        AppPreferences.INSTANCE.setIsPostGres(loginBean.isPostgres);
        AppPreferences.INSTANCE.setUserName(loginBean.username);
        AppPreferences.INSTANCE.setAccessToken(loginBean.tokenValue);
        AppPreferences.INSTANCE.setLogin(true);

        Intent intent = new Intent(getApplicationContext(), DashBoardActivity.class);
        startActivity(intent);
        finish();
     else
        Toast.makeText(getApplicationContext(), "Please check your username and password again!", Toast.LENGTH_LONG).show();




@Override
public void onNetworkCallError(String service, String errorMessage) 
    if (progressDialog != null && progressDialog.isShowing())
        progressDialog.dismiss();

    MessageDialog msg = new MessageDialog(LoginActivity.this);
    msg.setButtonText("Ok");
    msg.show(getResources().getString(R.string.error_somethingwent), getResources().getString(R.string.app_name));


【问题讨论】:

您是否收到类似java.io.IOException: Cleartext HTTP traffic to * not permitted 的错误?? ***.com/questions/53368470/… 【参考方案1】:

Android 6.0android manifest 的应用程序元素下引入了 useCleartextTraffic 属性。 Android P 中的默认值为“false”。将此设置为 true 表示应用打算使用清晰的网络流量。

<application
    android:usesCleartextTraffic="true"

</application>

但是,这似乎可以解决问题,但它会对数据完整性造成威胁。 Android 7.0 通过 network security configuration file

提供了更好的解决方案

【讨论】:

成功了。你拯救了我的一天。谢谢。 @PriyankaSinghal 呵呵 这不是一个完美的解决方案,因为默认情况下 android:usesClearTextTraffic 的值为 TRUE。确保并在官方 Android 文档上进行检查。 @DPrince 查看this Android 官方文档。 Starting with Android 9 (API level 28), cleartext support is disabled by default【参考方案2】:

在项目的AndroidManifest.xml 文件中添加以下行

<application
    android:usesCleartextTraffic="true">
            ...
</application>

【讨论】:

以上是关于Android Api(Okhttps)未在android 9(pie)及更高版本中调用[重复]的主要内容,如果未能解决你的问题,请参考以下文章

android gridlayout未在23岁以下的api中显示加权项目

Google maps api v2 Android 未在 locationListener 上更新

Android WebView 混合内容未在 api 级别 < 21 中加载

Android 8.1(API 27) - 重启后键盘未在Kiosk模式应用中显示

后台服务未在 Android Management API 中的完全托管设备上运行

text OKHttps