package com.example.mqttledmenu;
import android.Manifest;
import android.app.Notification;
import android.app.NotificationChannel;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.os.Build;
import android.os.Bundle;
import android.os.IBinder;
import android.util.Log;
import android.view.View;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.SimpleAdapter;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.app.NotificationCompat;
import androidx.core.content.ContextCompat;
import androidx.fragment.app.Fragment;
import androidx.viewpager2.widget.ViewPager2;
import com.bumptech.glide.Glide;
import com.bumptech.glide.load.resource.bitmap.CircleCrop;
import com.bumptech.glide.load.resource.drawable.DrawableTransitionOptions;
import com.bumptech.glide.request.RequestOptions;
import com.bumptech.glide.request.transition.DrawableCrossFadeFactory;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import org.eclipse.paho.android.service.MqttAndroidClient;
import org.eclipse.paho.client.mqttv3.IMqttActionListener;
import org.eclipse.paho.client.mqttv3.IMqttDeliveryToken;
import org.eclipse.paho.client.mqttv3.IMqttToken;
import org.eclipse.paho.client.mqttv3.MqttCallbackExtended;
import org.eclipse.paho.client.mqttv3.MqttConnectOptions;
import org.eclipse.paho.client.mqttv3.MqttException;
import org.eclipse.paho.client.mqttv3.MqttMessage;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.IOException;
import java.util.ArrayList;
import okhttp3.ResponseBody;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
import retrofit2.Retrofit;
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
ViewPager2 viewPager;
private LinearLayout tab_home, tab_focus, tab_subscribe;
private ImageView iv_home, iv_focus, iv_subscribe, iv_current;
//初始化MQTT协议相关变量
private static MqttAndroidClient mqttAndroidClient;
String serverUrl = "tcp://test.ranye-iot.net:1883";//使用开源的服务器
String clientId = "2f339b3eccd94c9da6726fa9a9eee9f3";//客户端的ID
Boolean isConnect = false;
private static final int REQUEST_CODE = 1;
ArrayList<String> subscribeList = new ArrayList<>();
private NotificationManager notificationManager;
private void checkPermission() {
try {
String[] PERMISSIONS_STORAGE = {Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE};
int permission = ActivityCompat.checkSelfPermission(this, "android.permission.WRITE_EXTERNAL_STORAGE");
if (permission != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this, PERMISSIONS_STORAGE, REQUEST_CODE);
} else {
}
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == REQUEST_CODE) {
if (grantResults[0] == PackageManager.PERMISSION_DENIED) {
Log.d("nightowl", "onRequestPermissionsResult: " + "拒绝文件权限!");
} else {
Log.d("nightowl", "onRequestPermissionsResult: " + "成功获取文件权限!");
}
}
}
public void getSubscribeList() {
subscribeList = new ArrayList<>();//清空数据
Retrofit retrofit = new Retrofit.Builder().baseUrl(Config.serverUrl).build();
UploadService uploadService = retrofit.create(UploadService.class);
Call<ResponseBody> call = uploadService.getPlate(Config.getInstance().getUserId());//与后端约定,不传入id直接获取全部
call.enqueue(new Callback<ResponseBody>() {
@Override
public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
String result = null;
try {
result = response.body().string();
JsonObject returnData = new JsonParser().parse(result).getAsJsonObject();
if (!returnData.get("code").toString().equals("200")) {
Toast.makeText(MainActivity.this, "服务端错误~", Toast.LENGTH_SHORT).show();
return;
}
try {
JSONArray myjsonArray = new JSONArray(returnData.get("data").toString());
for (int i = 0; i < myjsonArray.length(); i++) {
JSONObject jsonObject = myjsonArray.getJSONObject(i);
if (jsonObject.get("isSubscribe").toString().equals("1")) {
subscribeList.add(jsonObject.get("tag").toString());
}
}
} catch (JSONException e) {
Log.d("nightowl", "onResponse: yichang");
e.printStackTrace();
}
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void onFailure(Call<ResponseBody> call, Throwable t) {
}
});
}
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
checkPermission();
initPager();
initTabView();
initTabbarListener();
getSubscribeList();
initMQTTService();
}
public void initMQTTService() {
clientId = clientId + System.currentTimeMillis(); // 获取系统运行时间,保证ID的唯一性
mqttAndroidClient = new MqttAndroidClient(getApplicationContext(), serverUrl, clientId);
mqttAndroidClient.setCallback(new MqttCallbackExtended() {
public void connectComplete(boolean reconnect, String serverUrl) {
if (!isConnect && reconnect) {
isConnect = true;
subscribeTopic();//订阅主题
}
}
@Override
public void connectionLost(Throwable cause) {
Toast.makeText(MainActivity.this, "MQTT服务重连失败!", Toast.LENGTH_SHORT).show();
}
@Override
public void messageArrived(String topic, MqttMessage message) throws Exception {
noticeInfo(topic, message.toString());
}
@Override
public void deliveryComplete(IMqttDeliveryToken token) {
Toast.makeText(MainActivity.this, " 消息发送完成!", Toast.LENGTH_SHORT).show();
}
});
MqttConnectOptions mqttConnectOptions = new MqttConnectOptions();//定义一个mqttConnectOptions
mqttConnectOptions.setAutomaticReconnect(true);//自动重连
mqttConnectOptions.setCleanSession(false);//不清除会话
try {
mqttAndroidClient.connect(mqttConnectOptions, null, new IMqttActionListener() {
@Override
public void onSuccess(IMqttToken asyncActionToken) {
// Toast.makeText(MainActivity.this, "MQTT服务器连接成功!", Toast.LENGTH_SHORT).show();
isConnect = true;
subscribeTopic();//订阅主题
}
@Overr
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
基于MQTT的校园新闻APP原生Android项目源码(高分项目).zip已获导师指导并通过的97分的高分大作业设计项目,可作为课程设计和期末大作业,下载即用无需修改,项目完整确保可以运行。 基于MQTT的校园新闻APP原生Android项目源码(高分项目).zip已获导师指导并通过的97分的高分大作业设计项目,可作为课程设计和期末大作业,下载即用无需修改,项目完整确保可以运行。 基于MQTT的校园新闻APP原生Android项目源码(高分项目).zip已获导师指导并通过的97分的高分大作业设计项目,可作为课程设计和期末大作业,下载即用无需修改,项目完整确保可以运行。 基于MQTT的校园新闻APP原生Android项目源码(高分项目).zip已获导师指导并通过的97分的高分大作业设计项目,可作为课程设计和期末大作业,下载即用无需修改,项目完整确保可以运行。 基于MQTT的校园新闻APP原生Android项目源码(高分项目).zip已获导师指导并通过的97分的高分大作业设计项目,可作为课程设计和期末大作业,下载即用无需修改,项目完整确保可以运行。
资源推荐
资源详情
资源评论
收起资源包目录
基于MQTT的校园新闻APP原生Android项目源码.zip (92个子文件)
基于MQTT的校园新闻APP原生Android项目源码
gradle.properties 1KB
gradle
wrapper
gradle-wrapper.jar 58KB
gradle-wrapper.properties 232B
app
src
androidTest
java
com
example
mqttledmenu
ExampleInstrumentedTest.java 760B
main--实现多个activity均可发布和接受mqtt消息.zip 382KB
test
java
com
example
mqttledmenu
ExampleUnitTest.java 385B
main
java
com
example
mqttledmenu
Download.java 7KB
LoginActivity.java 5KB
Config.java 720B
FragmentHome.java 13KB
NewsItem.java 677B
HttpUtil.java 3KB
FragmentFocus.java 8KB
DetailsActivity.java 8KB
SoftKeyboardStateHelper.java 3KB
FragmentSubscribe.java 10KB
SubscribeItem.java 441B
FragmentPagerAdapter.java 851B
MainActivity.java 14KB
FileUtils.java 1KB
UploadService.java 1KB
res
navigation
mobile_navigation.xml 1KB
drawable-v24
user_info.png 5KB
has_read.png 3KB
mine_background.jpg 2.27MB
unknow_person.png 9KB
upload_default_img.png 10KB
safety.png 7KB
red_point.png 3KB
get_subscribe.png 4KB
arrow_right.png 2KB
loading.png 5KB
message_empty.png 8KB
setting.png 6KB
button_submit.png 843B
delete.png 4KB
cancel_subscribe.png 10KB
values-night
themes.xml 833B
mipmap-xhdpi
mine_background_foreground.png 89KB
xml
network_security_config.xml 203B
fileprovider.xml 864B
values
dimens.xml 210B
colors.xml 617B
style.xml 411B
strings.xml 350B
themes.xml 833B
layout
fragment_home.xml 2KB
dialog_progress.xml 718B
setting_adapter_item.xml 1KB
news_adapter_item.xml 3KB
fragment_focus.xml 793B
activity_login.xml 3KB
fragment_blank.xml 557B
fragment_subscribe.xml 1KB
activity_main.xml 610B
bottom_layout.xml 3KB
activity_details.xml 5KB
drawable
subscribe_default.png 7KB
background.jpeg 95KB
tab_home.xml 288B
tab_subscribe.xml 298B
tab_mine.xml 288B
mine_active.png 8KB
tab_focus.xml 290B
home_default.png 6KB
campus_notice.png 6KB
search.png 8KB
focus_default.png 6KB
focus_active.png 7KB
launch_active.png 9KB
launch_default.png 9KB
mine_default.png 8KB
home_active.png 6KB
tab_launch.xml 292B
subscribe_active.png 9KB
AndroidManifest.xml 3KB
proguard-rules.pro 750B
libs
commons-io-2.11.0.jar 319KB
build.gradle 2KB
.gitignore 6B
gradlew.bat 3KB
build.gradle 458B
.idea
.name 11B
render.experimental.xml 173B
vcs.xml 180B
misc.xml 8KB
compiler.xml 169B
gradle.xml 746B
.gitignore 47B
settings.gradle 422B
gradlew 6KB
.gitignore 225B
共 92 条
- 1
资源评论
- 泉此方5562024-05-24资源很不错,内容和描述一致,值得借鉴,赶紧学起来!
不安分的小女孩
- 粉丝: 9979
- 资源: 2394
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功