분류 전체보기

1 2 3 4 ··· 8

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

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로 변경해주면 에러없이 실행됩니다.



 

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] 한글깨짐 설정

2024. 8. 19. 16:40

# 한글 패키지 설치
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 설치

2024. 8. 19. 16:14

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를 이용한 발행(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

'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 사용.
        });
    }

 



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] 인앱업데이트

2021. 5. 12. 10:20

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:업데이트할 것이 없음 ");
        }
    });
}

 



앱 다시 실행하기


설정이 바뀌거나 기타 여러가지 경우에 앱을 다시 실행해야할 때가 있습니다.

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를 함께 사용하면

백그라운드에 남지 않고 다시 시작됩니다.

 

 


+ Recent posts