Android Api (Okhttps)在Android 9(Pie)及以上版本中未被调用。

11 浏览
0 Comments

Android Api (Okhttps)在Android 9(Pie)及以上版本中未被调用。

我以与其他版本手机相同的方式调用Android API,直到安卓8(即Oreo)版本都运行良好。但是在安卓9(即Pie)版本及以上,API无法被调用。如果在Pie版本中有任何更改,请告诉我。提前致谢。\n

private void getLoginAPI(String username, String password, String compnaycode) {
    if (NetworkStatus.isNetworkConnected(this)) {
        LoginReqBean bean = new LoginReqBean();
        bean.UserId = username;
        bean.Password = password;
        bean.Company = compnaycode;
        NetworkService serviceCall = new NetworkService(Constants.loginPost(), Constants.TAG_POST, this);
        serviceCall.call(bean);
    } else
        Toast.makeText(this, "请检查网络连接", Toast.LENGTH_SHORT).show();
}
@Override
public void onNetworkCallInitiated(String service) {
    progressDialog = ProgressDialog.show(LoginActivity.this, "信息", "正在验证凭据,请稍候...");
    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(), "登录成功!", 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(), "请再次检查您的用户名和密码!", 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("确定");
    msg.show(getResources().getString(R.string.error_somethingwent), getResources().getString(R.string.app_name));
}

0
0 Comments

在Android 9(Pie)及以上版本中,Android API(OkHttps)可能无法正常调用的问题。

问题原因:

在Android 9及以上版本中,系统默认禁止应用程序使用非加密的明文流量进行网络通信。这样的限制会导致使用Android API(OkHttps)时出现问题,导致无法正常调用。

解决方法:

在项目的AndroidManifest.xml文件中添加以下代码:

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

这样,Android系统将允许应用程序使用非加密的明文流量进行网络通信,解决了Android 9及以上版本中Android API(OkHttps)无法正常调用的问题。

0
0 Comments

在Android 9(Pie)及以上版本中,Android Api(Okhttps)不会被调用的原因是因为从Android 6.0开始,Android引入了在Android清单文件中的应用程序元素下的useCleartextTraffic属性。Android P的默认值为“false”。将其设置为true表示应用程序打算使用明文网络流量。

然而,这似乎可以解决问题,但它会对数据完整性造成威胁。Android 7.0提供了更好的解决方案,通过网络安全配置文件来解决这个问题。

但这并不是一个完美的解决方案,因为android:usesClearTextTraffic的默认值是TRUE。请确保在官方Android文档中进行检查。

从Android 9(API级别28)开始,默认情况下禁用了明文支持。

要解决这个问题,可以在清单文件的应用程序元素中添加android:usesCleartextTraffic="true"属性。这将允许应用程序使用明文网络流量。但请注意,这可能会对数据的安全性产生风险。

更好的解决方法是创建一个网络安全配置文件,在其中指定允许使用明文流量的域名。可以在官方Android文档中查找有关网络安全配置文件的详细信息。

通过这些方法,可以解决Android 9(Pie)及以上版本中Android Api(Okhttps)没有被调用的问题。

0