분류 전체보기
-
[Flutter] Firebase iOS 실행 오류2025.01.29
-
[Flutter]const 노란줄 안보이게 하기2025.01.29
-
[Ubuntu] 한글깨짐 설정2024.08.19
-
[Ubuntu] Mosquitto 설치2024.08.19
-
[Flutter] MQTT 브로커에 연결해서 데이터 송수신2024.03.21
-
[Android] UDP 브로드캐스트 수신하기2023.11.29
-
[Android] Screen ON/OFF 감지 이벤트2021.05.13
-
[Android] 인앱업데이트2021.05.12
-
[Android] 앱 다시 실행하기2021.04.06
warning: [options] source value 8 is obsolete and will be removed in a future release
warning: [options] target value 8 is obsolete and will be removed in a future release
warning: [options] To suppress warnings about obsolete options, use -Xlint:-options.
3 warnings
warning: [options] source value 8 is obsolete and will be removed in a future release
warning: [options] target value 8 is obsolete and will be removed in a future release
warning: [options] To suppress warnings about obsolete options, use -Xlint:-options.
Note: Some input files use or override a deprecated API.
Note: Recompile with -Xlint:deprecation for details.
3 warnings
warning: [options] source value 8 is obsolete and will be removed in a future release
warning: [options] target value 8 is obsolete and will be removed in a future release
warning: [options] To suppress warnings about obsolete options, use -Xlint:-options.
3 warnings
AOS로 실행은 되지만 위와 같은 빨간줄이 계속 뜨는걸 볼 수 있습니다.
이 경우에는 android/build.gradle에서 allprojects 내에 아래 코드를 추가해주시면 됩니다.
tasks.withType(JavaCompile) {
options.compilerArgs << '-Xlint:-options'
}
'플러터 > Flutter 에러' 카테고리의 다른 글
[Flutter] Firebase iOS 실행 오류 (0) | 2025.01.29 |
---|
[Flutter] Firebase iOS 실행 오류
dependencies에 firebase 추가 후 iOS로 run 했을 때 아래와 같은 에러 발생할 경우
Lexical or Preprocessor Issue (Xcode): Include of non-modular header inside framework module
'firebase_database.FLTFirebaseDatabaseObserveStreamHandler':
'/Users/heitor.candido/Documents/inteliApp/inteli/ios/Pods/Headers/Public/Firebase/Firebase.h'
/Users/heitor.candido/.pub-cache/hosted/pub.dev/firebase_database-11.1.1/ios/Classes/FLTFirebaseDatabaseObserveStreamHandler.h:3:8
ios - Runner.xcworkspace를 Finder에서 열어서 더블클릭으로 실행.
Runner 클릭해서 Build Settings에서
"Allow Non-modular Includes in Framework Modules" 검색해서 Yes로 변경해주면 에러없이 실행됩니다.
'플러터 > Flutter 에러' 카테고리의 다른 글
[Flutter] source value 8 is obsolete and will be removed in a future release 에러 (0) | 2025.02.09 |
---|
[Flutter]const 노란줄 안보이게 하기
analysis_options.yaml - rules 내에 3줄 작성 후 다시 실행.
prefer_const_constructors: false
prefer_const_literals_to_create_immutables: false
prefer_const_constructors_in_immutables: false
'플러터 > Flutter' 카테고리의 다른 글
[Flutter] MQTT 브로커에 연결해서 데이터 송수신 (0) | 2024.03.21 |
---|
[Ubuntu] 한글깨짐 설정
# 한글 패키지 설치
apt-get install language-pack-ko
# 한글 로케일 추가
locale-gen ko_KR.UTF-8
# 패키지 재설정
dpkg-reconfigure locales
- ko_KR.UTF-8 UTF-8 찾아서 해당번호 입력.
- ko_KR.UTF-8 찾아서 해당번호 입력.
echo -e "export LANGUAGE=ko_KR.UTF-8\nexport LANG=ko_KR.UTF-8">>~/.bashrc
입력 후 재시작.
locale
locale로 LANG, LANGUAGE에 한글 추가 확인.
'Ubuntu' 카테고리의 다른 글
[Ubuntu] Mosquitto 설치 (0) | 2024.08.19 |
---|
[Ubuntu] Mosquitto 설치
apt-get update
apt-get upgrade -y
# mosquitto 설치
apt-get install mosquitto mosquitto-clients -y
# mosquitto 활성화 및 시작
systemctl enable mosquitto
systemctl start mosquitto
# mosquitto 설치확인
systemctl status mosquitto
외부에서 접속하고자 할 경우 mosquitto.conf 파일에 코드 추가해야됨.
vi /etc/mosquitto/mosquitto.conf
listener 1883
allow_anonymous true
해당경로에 두 줄 추가하면 접속 가능.
'Ubuntu' 카테고리의 다른 글
[Ubuntu] 한글깨짐 설정 (0) | 2024.08.19 |
---|
[Flutter] MQTT 브로커에 연결해서 데이터 송수신
- Flutter에서 MQTT를 이용한 발행(publish) & 구독(subscribe)
pubspec.yaml 추가
mqtt_client: ^9.6.2
mqtt_client 패키지 추가
코드 추가
- MQTT 브로커 설정
Future<void> setupMqtt() async {
// MQTT 브로커 연결
client = MqttServerClient.withPort(broker, 'flutter_client', port);
// MQTT 로그 출력
client!.logging(on: false);
// 리스너 등록
client!.onConnected = onMqttConnected;
client!.onDisconnected = onMqttDisconnected;
client!.onSubscribed = onSubscribed;
try {
//
await client!.connect();
} catch (e) {
print('Connected Failed.. \nException: $e');
}
}
- MQTT publish
void publishData(String data) {
final payload = jsonEncode(data);
final builder = MqttClientPayloadBuilder();
builder.addString(payload);
client!.publishMessage(topic, MqttQos.exactlyOnce, builder.payload!);
}
- MQTT subscribe
// MQTT 연결 시 토픽 구독.
client!.subscribe(topic, MqttQos.atLeastOnce);
// 토픽 수신 리스너
client!.updates!.listen((List<MqttReceivedMessage<MqttMessage>> c) {
final MqttPublishMessage recMess = c[0].payload as MqttPublishMessage;
final String message =
MqttPublishPayload.bytesToStringAsString(recMess.payload.message);
// 수신한 메시지 처리
setState(() {
print(':: Received message: $message');
});
});
- 전체코드
import 'dart:convert';
import 'package:flutter/material.dart';
import 'package:mqtt_client/mqtt_client.dart';
import 'package:mqtt_client/mqtt_server_client.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
debugShowCheckedModeBanner: false,
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.green,
),
home: const MyHomePage(),
);
}
}
class MyHomePage extends StatefulWidget {
const MyHomePage({super.key});
@override
State<MyHomePage> createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
final String broker = /*브로커 주소*/; // MQTT broker address
final int port = /*포트*/; // MQTT broker port
final String topic = /*토픽명*/; // MQTT topic
MqttServerClient? client;
bool connected = false;
@override
void initState() {
super.initState();
setupMqtt(); // MQTT Set
}
Future<void> setupMqtt() async {
// MQTT 브로커 연결
client = MqttServerClient.withPort(broker, 'flutter_client', port);
// MQTT 로그 출력
client!.logging(on: false);
// 리스너 등록
client!.onConnected = onMqttConnected;
client!.onDisconnected = onMqttDisconnected;
client!.onSubscribed = onSubscribed;
try {
//
await client!.connect();
} catch (e) {
print('Connected Failed.. \nException: $e');
}
}
void onMqttConnected() {
print(':: MqttConnected');
setState(() {
connected = true;
// MQTT 연결 시 토픽 구독.
client!.subscribe(topic, MqttQos.atLeastOnce);
// 토픽 수신 리스너
client!.updates!.listen((List<MqttReceivedMessage<MqttMessage>> c) {
final MqttPublishMessage recMess = c[0].payload as MqttPublishMessage;
final String message =
MqttPublishPayload.bytesToStringAsString(recMess.payload.message);
// 수신한 메시지 처리
setState(() {
print(':: Received message: $message');
});
});
});
}
void onMqttDisconnected() {
print(':: MqttDisconnected');
setState(() {
connected = false;
});
}
void onSubscribed(String topic) {
print(':: Subscribed topic: $topic');
}
// 데이터 전송
void publishData(String data) {
final payload = jsonEncode(data);
final builder = MqttClientPayloadBuilder();
builder.addString(payload);
client!.publishMessage(topic, MqttQos.exactlyOnce, builder.payload!);
print(':: Send message: $data');
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
connected
? Text('CONNECTED')
: Text('DISCONNECTED'),
SizedBox(height: 16,),
ElevatedButton(
onPressed: () async {
publishData('MQTT SEND DATA');
},
child: Text('BUTTON'),
)
],
),
),
);
}
}
- 앱 실행 시 'topic' 구독 확인
- 버튼클릭 시 데이터 전송 (발행,구독을 모두 해둔 상태라 같이 보임)
- MQTT Explorer로 데이터 확인
- MQTT Explorer에서 데이터 publish 결과
'플러터 > Flutter' 카테고리의 다른 글
[Flutter]const 노란줄 안보이게 하기 (0) | 2025.01.29 |
---|
[Android] UDP 브로드캐스트 수신하기
'DatagramSocket'을 사용하여 UDP 브로드캐스트 메시지를 수신할 수 있습니다.
DatagramSocket 포트는 송신하는 쪽 포트를 적어주시면 됩니다.
- AndroidManifest에서 인터넷 사용 권한을 추가.
<uses-permission android:name="android.permission.INTERNET" />
- UdpBroadcastReceiver를 생성하여 메시지를 수신받는 쓰레드를 생성.
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
public class UdpBroadcastReceiver extends Thread {
private boolean running;
private DatagramSocket socket;
private byte[] buf = new byte[256];
public UdpBroadcastReceiver() {
try {
socket = new DatagramSocket(4445); // 4445 포트에서 수신
socket.setBroadcast(true);
} catch (SocketException e) {
e.printStackTrace();
}
}
public void run() {
running = true;
while (running) {
try {
DatagramPacket packet = new DatagramPacket(buf, buf.length);
socket.receive(packet);
InetAddress address = packet.getAddress();
int port = packet.getPort();
packet = new DatagramPacket(buf, buf.length, address, port);
String received = new String(packet.getData(), 0, packet.getLength());
// 수신된 메시지 처리
Log.d("UdpBroadcastReceiver", "Received Message: " + received);
if (received.equals("end")) {
running = false;
continue;
}
} catch (Exception e) {
e.printStackTrace();
running = false;
}
}
socket.close();
}
}
- 메인에서 해당 쓰레드 실행.
UdpBroadcastReceiver receiver = new UdpBroadcastReceiver();
receiver.start();
수신받은 데이터를 메인에서 처리하려면 콜백 인터페이스를 사용하여 쓰레드가 완료했을 때 콜백을 통해 결과를 전달받을 수 있습니다.
- 콜백 인터페이스 정의.
public interface ThreadCompleteListener {
void onThreadComplete(final String result);
}
- 쓰레드 수정.
쓰레드 작업 완료 시, 콜백 메서드를 호출할 수 있도록 설정.
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
public class UdpBroadcastReceiver extends Thread {
private ThreadCompleteListener listener;
private boolean running;
private DatagramSocket socket;
private byte[] buf = new byte[256];
public UdpBroadcastReceiver(ThreadCompleteListener listener) {
try {
socket = new DatagramSocket(4445); // 4445 포트에서 수신
socket.setBroadcast(true);
} catch (SocketException e) {
e.printStackTrace();
}
}
public void run() {
running = true;
while (running) {
try {
DatagramPacket packet = new DatagramPacket(buf, buf.length);
socket.receive(packet);
InetAddress address = packet.getAddress();
int port = packet.getPort();
packet = new DatagramPacket(buf, buf.length, address, port);
String received = new String(packet.getData(), 0, packet.getLength());
// 수신된 메시지 처리
Log.d("UdpBroadcastReceiver", "Received Message: " + received);
if (received.equals("end")) {
running = false;
continue;
}
} catch (Exception e) {
e.printStackTrace();
running = false;
}
}
socket.close();
}
}
- 메인에서 쓰레드 호출 수정.
UdpBroadcastReceiver receiver = new UdpBroadcastReceiver(this);
receiver.start();
- 메인에서 onThreadComplete으로 쓰레드 결과 처리.
implements 추가
public class MainActivity extends AppCompatActivity implements ThreadCompleteListener {
onThreadComplete
@Override
public void onThreadComplete(String result) {
// 스레드 결과 처리.
runOnUiThread(() -> {
// UI수정할 경우 runOnUiThread 사용.
});
}
'안드로이드 > Android' 카테고리의 다른 글
[Android] Screen ON/OFF 감지 이벤트 (0) | 2021.05.13 |
---|---|
[Android] 인앱업데이트 (0) | 2021.05.12 |
[Android] 앱 다시 실행하기 (0) | 2021.04.06 |
[Android] URL 유효성 체크(마켓에 유효한 앱인지 확인) (0) | 2021.04.01 |
[Android] Handler로 딜레이 주기 (0) | 2021.03.17 |
[Android] Screen ON/OFF 감지 이벤트
IntentFilter를 생성시켜주고, 원하는 액션을 intentFilter에 등록시켜줍니다.
그런다음 BroadcastReceiver를 생성하여 onReceive 안에 다음과 같이 작성해주시면 됩니다.
화면꺼짐(ACTION_SCREEN_OFF)을 예로 했는데 화면켜짐(ACTION_SCREEN_ON)을 사용하시려면
intentFilter에 화면켜짐을 등록하시고 조건문을 통해서 사용해주시면 됩니다.
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(Intent.ACTION_SCREEN_OFF);
BroadcastReceiver receiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
if(intent.getAction().equals(Intent.ACTION_SCREEN_OFF)){
// 원하는 코드작성
}
}
};
registerReceiver(receiver, intentFilter);
'안드로이드 > Android' 카테고리의 다른 글
[Android] UDP 브로드캐스트 수신하기 (0) | 2023.11.29 |
---|---|
[Android] 인앱업데이트 (0) | 2021.05.12 |
[Android] 앱 다시 실행하기 (0) | 2021.04.06 |
[Android] URL 유효성 체크(마켓에 유효한 앱인지 확인) (0) | 2021.04.01 |
[Android] Handler로 딜레이 주기 (0) | 2021.03.17 |
[Android] 인앱업데이트
1. implementation 추가
implementation 'com.google.android.play:core:1.10.0'
2. 인앱업데이트 메서드 추가
클래스 내부에 해당 메서드를 추가시켜주시고 onCreate()에서 호출해주시면
앱을 실행했을 때 상위버전이 존재하면 인앤업데이트 화면이 켜지게 됩니다.
아래 메서드에서 AppUpdateType.IMMEDIATE를 이용해서 앱을 강제로 업데이트가 가능합니다.
(강제 업데이트 외에 권장 업데이트 방법도 있습니다.)
인앱업데이트 확인방법은 베타테스트를 이용해서 확인하시면 됩니다.
// 인앱 강제 업데이트
private void updaterequest() {
AppUpdateManager appUpdateManager = AppUpdateManagerFactory.create(getApplicationContext());
Task<AppUpdateInfo> appUpdateInfoTask = appUpdateManager.getAppUpdateInfo();
appUpdateInfoTask.addOnSuccessListener(appUpdateInfo -> {
if (appUpdateInfo.updateAvailability() == UpdateAvailability.UPDATE_AVAILABLE
&& appUpdateInfo.isUpdateTypeAllowed(AppUpdateType.IMMEDIATE)) {
Log.d("WTF", "updaterequest:업데이트할 수 있음 ");
try {
appUpdateManager.startUpdateFlowForResult(
appUpdateInfo,
AppUpdateType.IMMEDIATE,
this,
UPDATE_REQUEST_CODE);
Log.d("WTF", "updaterequest:업데이트 요청함 ");
} catch (IntentSender.SendIntentException e) {
e.printStackTrace();
}
}else{
Log.d("WTF", "updaterequest:업데이트할 것이 없음 ");
}
});
}
'안드로이드 > Android' 카테고리의 다른 글
[Android] UDP 브로드캐스트 수신하기 (0) | 2023.11.29 |
---|---|
[Android] Screen ON/OFF 감지 이벤트 (0) | 2021.05.13 |
[Android] 앱 다시 실행하기 (0) | 2021.04.06 |
[Android] URL 유효성 체크(마켓에 유효한 앱인지 확인) (0) | 2021.04.01 |
[Android] Handler로 딜레이 주기 (0) | 2021.03.17 |
[Android] 앱 다시 실행하기
앱 다시 실행하기
설정이 바뀌거나 기타 여러가지 경우에 앱을 다시 실행해야할 때가 있습니다.
public void restart(){
Intent intent = getBaseContext().getPackageManager().
getLaunchIntentForPackage(getBaseContext().getPackageName());
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
getActivity().finishAffinity();
}
FLAG_ACTIVITY_CLEAR_TASK와 FLAG_ACTIVITY_NEW_TASK를 함께 사용하면
백그라운드에 남지 않고 다시 시작됩니다.
'안드로이드 > Android' 카테고리의 다른 글
[Android] Screen ON/OFF 감지 이벤트 (0) | 2021.05.13 |
---|---|
[Android] 인앱업데이트 (0) | 2021.05.12 |
[Android] URL 유효성 체크(마켓에 유효한 앱인지 확인) (0) | 2021.04.01 |
[Android] Handler로 딜레이 주기 (0) | 2021.03.17 |
[Android] getId() 문자 가져오기 (0) | 2021.03.17 |