發表文章

[flutter] 如何防止GPS偽定位

在 Flutter 開發中,要防止 GPS 偽定位並確保應用程式獲取的地理位置是可信的,可以採取以下方法來符合 Android 和 iOS 的需求: 1. 啟用 Google Play Services 的「位置驗證」 適用於:Android Google 提供了「位置驗證 (Location Verification)」功能,可以偵測裝置的 GPS 是否受到軟體偽造攻擊。 你可以透過 FusedLocationProvider 的 setMockMode(false) 來防止應用程式接受模擬位置。 步驟 在 AndroidManifest.xml 加入權限: < uses-permission android:name = "android.permission.ACCESS_FINE_LOCATION" /> < uses-permission android:name = "android.permission.ACCESS_COARSE_LOCATION" /> 使用 locationSettingsRequest 來確保 GPS 設定正確: import 'package:geolocator/geolocator.dart'; Future<Position> getLocation() async { bool serviceEnabled; LocationPermission permission; // 檢查 GPS 是否開啟 serviceEnabled = await Geolocator.isLocationServiceEnabled(); if (!serviceEnabled) { return Future.error('位置服務未啟用'); } // 檢查權限 permission = await Geolocator.checkPermission(); if (permission == LocationPermission.denied) { permission = await Geolocator.requestPer...

[flutter]flutter如何防止GPS偽定位

在 Flutter 中,要防止 GPS 偽定位(Mock Location),可以採取以下幾種方法: 1. 檢測是否啟用了 Mock Location(Android) 在 Android 設備上,你可以使用 isMockLocation 來判斷位置數據是否是模擬的。 方法 1:透過 Location 插件 import 'package:location/location.dart'; Future<bool> isMockLocationEnabled() async { Location location = Location(); LocationData locationData = await location.getLocation(); return locationData.isMock ?? false; } 方法 2:透過 locationManager (更準確) 使用 MethodChannel 來直接調用原生 Android API 來檢測 Mock Location: import 'package:flutter/services.dart'; Future<bool> isMockLocation() async { const platform = MethodChannel('mock_location_checker'); try { final bool result = await platform.invokeMethod('isMockLocation'); return result; } on PlatformException { return false; } } 對應的 Android 原生代碼(Kotlin): package com.example.app import android.content.Context import android.location.Location import android.location.LocationManager import android.os.Build import io...

[flutter]google_mobile_ads 安裝與使用範例

超完整 ✅ Flutter google_mobile_ads 安裝與使用範例來囉! 這套件用來整合 Google AdMob 廣告 ,支援 Banner、Interstitial(插頁)、Rewarded(獎勵) 廣告。 ✅ pubspec.yaml 安裝 dependencies: google_mobile_ads: ^5.1.0 ✅ Android 設定 (android/app/src/main/AndroidManifest.xml) 在 <application> 裡加入: < meta-data android:name = "com.google.android.gms.ads.APPLICATION_ID" android:value = "ca-app-pub-3940256099942544~3347511713" /> <!-- 測試 App ID --> 👉 注意:上線時換成你自己的 AdMob App ID ✅ iOS 設定 (ios/Runner/Info.plist) 加入: < key >GADApplicationIdentifier </ key > < string >ca-app-pub-3940256099942544~1458002511 </ string > <!-- 測試 App ID --> ✅ 初始化 (main.dart) import 'package:google_mobile_ads/google_mobile_ads.dart'; void main() { WidgetsFlutterBinding.ensureInitialized(); MobileAds.instance.initialize(); // 初始化廣告 SDK runApp(MyApp()); } ✅ Banner Ad 範例 class MyBannerAd extends StatefulWidget { @override State<MyBannerAd>...

[flutter]StreamBuilder 如何使用?

 在 Flutter 中使用 StreamBuilder StreamBuilder 是 Flutter 提供的一个小部件(widget),用于监听 Stream 并在数据更新时自动重建 UI。 🛠 基本用法 import 'dart:async'; import 'package:flutter/material.dart'; void main() { runApp(MaterialApp(home: StreamBuilderExample())); } class StreamBuilderExample extends StatefulWidget { @override _StreamBuilderExampleState createState() => _StreamBuilderExampleState(); } class _StreamBuilderExampleState extends State<StreamBuilderExample> { // 创建一个周期性 Stream,每秒钟发送一个数字 Stream<int> _counterStream() { return Stream.periodic(Duration(seconds: 1), (count) => count); } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar(title: Text("StreamBuilder 示例")), body: Center( child: StreamBuilder<int>( stream: _counterStream(), // 绑定 Stream initialData: 0, // 初始数据 builder: (context, snapshot) { if (snapshot.connectionState == Connec...

[flutter]showModalBottomSheet 最完整的 Flutter 範例

  showModalBottomSheet 用於在畫面底部彈出一個 模態(Modal)底部對話框 ,可用於顯示選項、表單或其他 UI 元件。 最基本的 showModalBottomSheet import 'package:flutter/material.dart'; void main() { runApp(MyApp()); } class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( debugShowCheckedModeBanner: false, home: HomeScreen(), ); } } class HomeScreen extends StatelessWidget { @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar(title: Text('BottomSheet 範例')), body: Center( child: ElevatedButton( onPressed: () { showModalBottomSheet( context: context, builder: (BuildContext context) { return Container( padding: EdgeInsets.all(16), height: 200, child: Column( children: [ Text('這是 Bottom Sheet', style: TextStyle(fontSiz...

[flutter]如何在手機上測試 Flutter App

圖片
Flutter 支援 Android 和 iOS 實機測試,你可以透過 USB 連接手機,然後直接在手機上運行你的 Flutter 應用程式。 1. 準備環境 🛠 安裝必要工具 Flutter SDK ( 官方下載 ) Android Studio / VS Code (用於開發) Android 手機 / iPhone (實機測試) 🔹 確認 Flutter 安裝是否完整 : flutter doctor 如果有任何問題,請依照提示修復。 2. 在 Android 手機上測試 🔹 (1) 啟用 USB 偵錯 打開手機「開發者選項」 到 「設定」→「關於手機」 連續點擊 「版本號」 7 次,解鎖開發者模式 返回 「設定」→「系統」→「開發者選項」 開啟「USB 偵錯」 用 USB 連接手機 確保你的手機和電腦連接成功 選擇「允許 USB 偵錯」 確認設備是否可用 flutter devices 若成功,應該會顯示類似: 運行應用 flutter run ✅ 成功後,App 會自動安裝並在手機上運行! 3. 在 iPhone 上測試 🔹 (1) 準備 iOS 設備 安裝 Xcode (Mac 限定) sudo xcode-select --switch /Applications/Xcode.app/Contents/Developer sudo xcodebuild -runFirstLaunch 用 USB 連接 iPhone 確保 信任此電腦 在 「設定」→「隱私權與安全性」→「開發者模式」 開啟 安裝 CocoaPods(如果尚未安裝) sudo gem install cocoapods 確認設備是否可用 flutter devices 如果顯示 iPhone,代表可用: 1 connected device: iPhone 13 Pro (mobile) • 00008110 -001 D50D21E90001E • ios • iOS 16.0 運行應用 flutter run ✅ 成功後,App 會出現在你的 iPhone 上! 4. 無線測試(不接 USB) 如果你不想每次都插 USB,可以使用 Wi-Fi 無線調試 : 🔹 (1) Android 在 Android Studio 中開啟「Device Manager」 選...

Kali防火墙ufw安装与命令

圖片
linux.kali=kali-linux-2020.1a-installer-amd64.iso 安装 ufw 防火墙 apt-get install ufw ufw 防火墙命令 ufw status :检查防火墙的状态(默认 inactive) ufw version :查看 ufw 防火墙版本 ufw enable :启动 ufw 防火墙 ufw disable :关闭ufw防火墙 ufw default deny :默认禁止访问所有 ufw allow 22/tcp :开放 22/tcp 端口 ufw allow 53 :开放53端口(tcp/udp) ufw deny 3306 :禁止3306访问 ufw delete allow 22 :删除已经添加过的规则 ufw allow from 192.168.8.1 :允许此IP访问所有的本机端口 ufw delete allow from 192.168.8.1 : 删除上面的规则 ufw status numbered :查看规则,显示行号 ufw delete 3 :删除第三条规则 ufw reload : 重新加载防火墙 ufw reset :重置防火墙

[android studio]模擬器啟動失敗問題解決

圖片
  你的 Android 模擬器 (AVD: Pixel 5 API 33) 啟動後立即終止,可能是由於以下原因造成的。請按照下面的解決方案來嘗試修復問題。 解決方法 1️⃣ 檢查 AVD 設定 模擬器可能無法正確啟動,請嘗試: 打開 Android Studio 進入 AVD Manager : 點選 Tools > Device Manager 找到 Pixel 5 API 33 點擊 Edit (鉛筆圖示) 確保: Graphics 設定為 Software (如果 Hardware 無法運行) 記憶體 (RAM) 至少設為 2GB (2048 MB) 按 Finish 重新儲存設定,然後再試著啟動模擬器。 2️⃣ 檢查 HAXM 是否安裝(Intel CPU) 如果你使用的是 Intel 處理器 ,HAXM (Hardware Accelerated Execution Manager) 需要安裝或更新: 打開 Android Studio > SDK Manager 切換到 SDK Tools 檢查 Intel x86 Emulator Accelerator (HAXM installer) 是否已安裝 如果未安裝,請勾選並點擊 Apply 安裝 重新啟動模擬器並嘗試運行 如果是 AMD 處理器,請確保安裝了 Windows Hypervisor Platform (WHPX) 3️⃣ 使用終端機手動啟動模擬器 打開命令提示字元 (cmd) 執行以下指令: cd %LOCALAPPDATA%\Android\Sdk\emulator emulator -avd Pixel_5_API_33 -no-snapshot-load 如果仍然崩潰,請嘗試: emulator -avd Pixel_5_API_33 -no-snapshot 4️⃣ 檢查 Hyper-V (Windows) 如果你的電腦啟用了 Hyper-V ,可能會與 Android 模擬器發生衝突: 打開 控制台 > 程式與功能 > 開啟或關閉 Windows 功能 取消勾選 Hyper-V,然後重啟電腦 ⚠ 如果你的電腦 沒有 Intel HAXM ,則需要 開啟 Hyper-V 來使用 Android 模擬器。 5️⃣ 清除 AVD ...

在 flutter 中如何取得 wifi 明細 (支援 ios)

 在 Flutter 中,你可以使用  `connectivity`  套件來取得有關網絡連接的詳細信息,其中包括 Wi-Fi 的相關設定。這個套件可以應用在 iOS 和 Android 上。  要取得 Wi-Fi 的詳細資訊,你需要先將  `connectivity`  套件與  `wifi_info_plugin`  套件一起安裝。其中  `wifi_info_plugin`  套件是專門用於取得 Wi-Fi 相關資訊的。  以下是在 Flutter 中如何取得 wifi 明細的程式碼示例: import 'package:connectivity/connectivity.dart'; import 'package:wifi_info_plugin/wifi_info_plugin.dart';  Future<void> fetchWifiDetails() async {   var connectivityResult = await (Connectivity().checkConnectivity());   if (connectivityResult == ConnectivityResult.wifi) {     // Wi-Fi is connected, fetch the details     try {       final wifiDetails = await WifiInfoPlugin().getWifiDetails();       print(wifiDetails.ssid); // Wi-Fi SSID       print(wifiDetails.ip); // IP address       print(wifiDetails.macAddress); // MAC address       print(wifiDetails.frequency); // Frequ...

在 Flutter 移動應用程序中,如何將已選擇的圖片上傳至主機

 要將已選擇的圖片上傳至主機,您需要執行以下步驟:  1. 首先,您需要使用 Flutter 中的 ImagePicker 插件來選擇圖片。您可以使用該插件從相機或圖片庫選擇圖片,並將其保存到設備的暫存目錄中。  以下是選擇圖片的代碼示例: final picker = ImagePicker(); final pickedFile = await picker.getImage(source: ImageSource.gallery);  setState(() {   _image = File(pickedFile.path); }); 2. 接下來,您需要將圖片上傳到主機。為此,您可以使用 Dart 中的 http 库執行 HTTP POST 請求。在請求中,您可以將圖片作為二進制數據傳輸。  以下是將圖片上傳到主機的代碼示例: final uri = Uri.parse("http://yourserver.com/upload"); final request = http.MultipartRequest('POST', uri)   ..files.add(await http.MultipartFile.fromPath('image', _image.path));  final response = await request.send();  if (response.statusCode == 200) {   print('Image uploaded successfully'); } else {   print('Error uploading image'); } 在上面的代碼示例中,我們首先創建一個 MultipartRequest 對象,然後使用它來添加圖片文件。然後,我們使用 request.send() 方法發送 POST 請求,並在響應狀態碼為 200 時打印成功消息,否則打印錯誤消息。  這是將選擇的圖片上傳到主機的一種方法。您可以根據您的需求進行調整和改進。