由于要参加比赛,因此必须学会用安卓来控制新大陆云平台,后期还会用C#控制,最后更新STM32部分代码
新大陆云平台官网:http://www.nlecloud.com/
本章主要先介绍如何写一个安卓登录云平台的程序.
首先,我们从云平台的官网来看,如下图所示
先查看部分接口,可以知道我们要先登录获取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(MainActivity.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请求
<network-security-config>
<base-config cleartextTrafficPermitted="true" />
network-security-config>
然后在APP的AndroidManifest.xml文件下的application标签增加以下属性
<application
...
android:networkSecurityConfig="@xml/network_security_config"
...
/>
遇到问题要学会使用debug,不然都不知道问题出现在哪里