您好,欢迎来到外链网!
当前位置:外链网 » 站长资讯 » 专业问答 » 文章详细 订阅RssFeed

安卓控制新大陆云平台一键登录

来源:互联网 浏览:64次 时间:2023-04-08
前言

由于要参加比赛,因此必须学会用安卓来控制新大陆云平台,后期还会用C#控制,最后更新STM32部分代码

新大陆云平台官网:http://www.nlecloud.com/

本章主要先介绍如何写一个安卓登录云平台的程序.

使用C#封装了部分API 部分API接口
部分封装的安卓SDK会在后续给出



一、云平台介绍

首先,我们从云平台的官网来看,如下图所示

先查看部分接口,可以知道我们要先登录获取AccessToken才能进行后续的操作


我们用post请求之后,可以获得对应的AccessToken



二、安卓开发介绍

这里,我假设大家掌握的基础是基本的布局和控件使用

首先,我们先去官网下载新大陆云平台的Sdk

接着,在Android studio中import Module

接下来,对新导入的模块build

成功后如下图所示

如果导入nlecloud-sdk的包不存在,尝试以下操作
在build.gradle(Module.app)中加入如下语句


布局文件,大致如下

由于代码比较简单,这里我就不贴出布局文件的代码了

接下来就是使用安卓来登录云平台,在这里,大家如果理解网页上如何使用post请求登录云平台的话,那么这里就会变得非常简单。
首先,先看部分函数代码

我们在nlecloud-sdk中找到如下类,NewWorkBusiness,可以知道该类的包含了一个signIn登录函数,那么我们就需要使用这个类来登录新平台,该类,调用了apiService的signIn函数,我们接着往下看apiService类


看着很复杂,实际上,我们一点一点的理解,首先该类是一个api服务类,有点像第一张图的那样,该方法返回的是一个responseEntity,而ResponseEntity :标识整个http相应:状态码、头部信息、响应体内容(spring)。基本意思就是这样,大致理解就是一个请求网页的响应,分析结束



代码如下 public class MainActivity extends AppCompatActivity { private EditText username; //账户 private EditText password; //密码 private Button login; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //登录 login = (Button) findViewById(R.id.login); username = (EditText)findViewById(R.id.username); password = (EditText)findViewById(R.id.password); login.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { signIn(); } }); } private void signIn(){ String platformAddress = "http://api.nlecloud.com:80/"; final String _username = username.getText().toString();// "17674738454"; final String _password = password.getText().toString();//"123456"; if (_username.equals("") || _password.equals("")){ Toast.makeText(this,"用户名或密码不为空",Toast.LENGTH_SHORT).show(); return ; } final NetWorkBusiness netWorkBusiness = new NetWorkBusiness("",platformAddress); netWorkBusiness.signIn(new SignIn(_username, _password), new Callback<BaseResponseEntity<User>>() { @Override public void onResponse(@NonNull Call<BaseResponseEntity<User>> call, @NonNull Response<BaseResponseEntity<User>> response) { BaseResponseEntity<User> baseResponseEntity = response.body();//获得响应体 if (baseResponseEntity != null) { if (baseResponseEntity.getStatus() == 0) { //需要传输秘钥 String accessToken = baseResponseEntity.getResultObj().getAccessToken(); //json数据返回 Intent intent = new Intent(MainActivity.this, MenuActivity.class); Bundle bundle = new Bundle(); bundle.putString("accessToken", accessToken); intent.putExtras(bundle); startActivity(intent); finish(); } else { Toast.makeText(便宜美国vpsMainActivity.this, baseResponseEntity.getMsg(), Toast.LENGTH_SHORT).show(); //返回为空... } } } @Override public void onFailure(Call<BaseResponseEntity<User>> call, Throwable t) { Toast.makeText(MainActivity.this,"登录失败 " + t.getMessage(),Toast.LENGTH_SHORT).show(); } }); }}

几个问题

1 由于该应用是一个联网应用,必须请求网络权限,添加如下语句

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

2 一开始不知道怎么回事,一直登陆失败,尝试在onFailure中显示错误信息t.getMessage(),结果得到的反馈是

java.net.UnknownServiceException: CLEARTEXT communication ** not
permitted by network security polic

百度了一下,得到的问题是Android P http网络请求的问题

Google表示,为保证用户数据和设备的安全,针对下一代 Android 系统(Android P) 的应用程序,将要求默认使用加密连接,这意味着 Android P 将禁止 App 使用所有未加密的连接,因此运行 Android P 系统的安卓设备无论是接收或者发送流量,未来都不能明码传输,需要使用下一代(Transport Layer Security)传输层安全协议,而 Android Nougat 和 Oreo 则不受影响。

解决方法如下:

在 res 下新增一个 xml 目录,然后创建一个名为:network_security_config.xml 文件(名字自定) ,内容如下,大概意思就是允许开启http请求

<?xml version="1.0" encoding="utf-8"?><network-security-config> <base-config cleartextTrafficPermitted="true" /></network-security-config>

然后在APP的AndroidManifest.xml文件下的application标签增加以下属性

<application... android:networkSecurityConfig="@xml/network_security_config"... />

总结

遇到问题要学会使用debug,不然都不知道问题出现在哪里

65088317