Android Api (Okhttps)在Android 9(Pie)及以上版本中未被调用。
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)); }
在Android 9(Pie)及以上版本中,Android API(OkHttps)可能无法正常调用的问题。
问题原因:
在Android 9及以上版本中,系统默认禁止应用程序使用非加密的明文流量进行网络通信。这样的限制会导致使用Android API(OkHttps)时出现问题,导致无法正常调用。
解决方法:
在项目的AndroidManifest.xml
文件中添加以下代码:
<application android:usesCleartextTraffic="true"> ... </application>
这样,Android系统将允许应用程序使用非加密的明文流量进行网络通信,解决了Android 9及以上版本中Android API(OkHttps)无法正常调用的问题。
在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)没有被调用的问题。