Skip to content

Latest commit

 

History

1 Commit

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

dt_car_auto

dt_car_auto, Flutter uygulamanizdaki verileri Android Auto ve Apple CarPlay arayuzlerine tasiyan bir eklentidir.

Bu paketle:

  • Sarj istasyonlarini arac ekraninda listeleyebilir,
  • Yetkili servis noktalarini gosterebilir,
  • Istasyon detay ve soket bilgilerini acabilir,
  • Yol yardim / acil cagri aksiyonlari sunabilir,
  • Konum izni durumuna gore uygun ekran akislarini yonetebilirsiniz.

Paket, Flutter ile native taraf arasinda dt_carplay_channel method channel'i uzerinden haberlesir ve veriyi uygulamanizin sagladigi callback'lerden alir.

Ozellikler

  • Android Auto POI (Point of Interest) tabanli ekran akisi
  • Apple CarPlay list/POI/sunum akisi
  • Marka bilgisi ve yol yardim destegi
  • Konum
  • Istasyon detay/soket bilgisi
  • Flutter tarafinda tek bir servis ile entegrasyon: DtCarPlayService.init(...)

Ekran Goruntuleri

Android Auto

Ana Ekran Istasyonlar
Android Auto Home Android Auto Stations
Istasyon Detay Soketler
Android Auto Station Detail Android Auto Connector
Servisler Servis Detay
Android Auto Services Android Auto Service Detail
Yol Yardim
Android Auto Road Assist

Apple CarPlay

Istasyonlar Istasyon Detay
CarPlay Stations CarPlay Station Detail
Soketler Servisler
CarPlay Connector CarPlay Services
Servis Detay Yol Yardim
CarPlay Service Detail CarPlay Road Assist

Kurulum

1) Paket bagimliligini ekleyin

dependencies:
	dt_car_auto: ^0.0.1

Ardindan:

flutter pub get

2) Flutter tarafinda servisi baslatin

Asagidaki akis example/lib/main.dart ile birebir ayni yaklasimi kullanir.

import 'package:dt_car_auto/dt_brand_enum.dart';
import 'package:dt_car_auto/dt_car_auto.dart';
import 'package:flutter/material.dart';

void main() async {
	WidgetsFlutterBinding.ensureInitialized();
	await DtCarPlayService.init(
		brand: Brands.audi,
		getChargeStations: () async {
			// Kendi API sonucunuz: { "items": [ ... ] }
			return {"items": []};
		},
		getAuthorizedServices: () async {
			// Kendi API sonucunuz: { "items": [ ... ] }
			return {"items": []};
		},
		getDChargeStationById: (String id) async {
			// Kendi API sonucunuz: { "result": { ... } }
			return {"result": {}};
		},
		// Simulator gelistirme surecinde gecici olarak true yapilabilir.
		ignoreLocationError: true,
	);

	runApp(const MyApp());
}

Veri Sozlesmesi (Callback Kontratlari)

Native taraf bu methodlari Flutter'dan bekler:

  • getChargeStations
  • getAuthorizedServices
  • getDChargeStationById
  • checkLocation
  • getBrand

getChargeStations donusu

{
	"items": [
		{
			"id": "unique-station-id",
			"name": "Station Name",
			"address": "Address",
			"latitude": 41.0,
			"longitude": 29.0,
			"isAcSupported": true,
			"isDcSupported": true,
			"distance": 12.3,
			"distanceUnit": "km",
			"totalAcCount": 2,
			"totalDcCount": 1,
			"isFavourite": false
		}
	]
}

getAuthorizedServices donusu

{ "items": [...] } formatinda servis listesi beklenir. example projesindeki DtCarAutoExampleDataProvider.getAuthorizedServices() methodu referans alinmalidir.

getDChargeStationById donusu

{ "result": { ... } } formatinda detay beklenir. Ozellikle result.units[].connectors[] alani soket ekrani icin kullanilir.

Android Auto Entegrasyonu

Asagidaki adimlar example/android/app/src/main/AndroidManifest.xml ve example/android/app/src/main/res/xml/automotive_app_desc.xml dosyalarini referans alir.

1) Izinleri ekleyin

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="androidx.car.app.ACCESS_SURFACE" />
<uses-permission android:name="androidx.car.app.MAP_TEMPLATES" />

2) application altina car metadata ve service tanimini ekleyin

<meta-data
		android:name="com.google.android.gms.car.application"
		android:resource="@xml/automotive_app_desc" />

<meta-data
		android:name="androidx.car.app.metadata"
		android:value="true" />

<meta-data
		android:name="androidx.car.app.minCarApiLevel"
		android:value="1"/>

<service
		android:name="com.example.dt_car_auto.AndroidAutoService"
		android:exported="true"
		android:icon="@mipmap/ic_launcher">
		<intent-filter>
				<action android:name="androidx.car.app.CarAppService" />
				<category android:name="androidx.car.app.category.POI"/>
		</intent-filter>
</service>

3) res/xml/automotive_app_desc.xml dosyasi olusturun

<?xml version="1.0" encoding="utf-8"?>
<automotiveApp>
		<uses name="template" />
</automotiveApp>

Not: Android Auto tarafinda konum tabanli gorunumler icin runtime permission akisinizin uygulama acilisinda dogru calistigindan emin olun.

iOS CarPlay Entegrasyonu

1) Info.plist ayarlari

Asagidaki blok, example/ios/Runner/Info.plist dosyasindaki ilgili kisimdir:

<key>NSLocationAlwaysAndWhenInUseUsageDescription</key>
<string>Size en yakın istasyonları görebilmeniz için konum izni vermeniz gerekmektedir</string>
<key>NSLocationAlwaysUsageDescription</key>
<string>Size en yakın istasyonları görebilmeniz için konum izni vermeniz gerekmektedir</string>
<key>NSLocationWhenInUseUsageDescription</key>
<string>Size en yakın istasyonları görebilmeniz için konum izni vermeniz gerekmektedir</string>
<key>UISupportsCarPlay</key>
<true/>
<key>UIApplicationSceneManifest</key>
<dict>
	<key>UIApplicationSupportsMultipleScenes</key>
	<true/>
	<key>UISceneConfigurations</key>
	<dict>
		<key>CPTemplateApplicationSceneSessionRoleApplication</key>
		<array>
			<dict>
				<key>UISceneConfigurationName</key>
				<string>CarPlay Configuration</string>
				<key>UISceneDelegateClassName</key>
				<string>DtCarAutoSceneDelegate</string>
			</dict>
		</array>
		<key>UIWindowSceneSessionRoleApplication</key>
		<array>
			<dict>
				<key>UISceneConfigurationName</key>
				<string>Default Configuration</string>
				<key>UISceneDelegateClassName</key>
				<string>$(PRODUCT_MODULE_NAME).SceneDelegate</string>
			</dict>
		</array>
	</dict>
</dict>

2) Entitlement ekleyin

Runner.entitlements icine su anahtari ekleyin:

<dict>
<key>com.apple.developer.carplay-charging</key>
<true/>
</dict>

3) Flutter engine/plugin registrant enjeksiyonu

AppDelegate.swift:

import Flutter
import UIKit
import dt_car_auto

@main
@objc class AppDelegate: FlutterAppDelegate {
	override func application(
		_ application: UIApplication,
		didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
	) -> Bool {
		FlutterHelper.shared.pluginRegistrant = { engine in
			GeneratedPluginRegistrant.register(with: engine)
		}
		return super.application(application, didFinishLaunchingWithOptions: launchOptions)
	}
}

SceneDelegate.swift:

import Flutter
import dt_car_auto
import UIKit

@available(iOS 13.0, *)
class SceneDelegate: UIResponder, UIWindowSceneDelegate {
	var window: UIWindow?

	func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
		guard let windowScene = scene as? UIWindowScene else { return }

		FlutterHelper.shared.pluginRegistrant = { engine in
			GeneratedPluginRegistrant.register(with: engine)
		}

		let window = UIWindow(windowScene: windowScene)
		let controller = FlutterHelper.shared.makeFlutterViewController()
		window.rootViewController = controller
		self.window = window
		window.makeKeyAndVisible()
	}
}

Bu adim, headless/shared FlutterEngine kullaniminda pluginlerin (ornegin geolocator) dogru register edilmesi icin kritiktir.

Marka Bilgisi

Paket icinde hazir gelen markalar:

  • Brands.audi
  • Brands.porsche
  • Brands.seat
  • Brands.skoda
  • Brands.cupra
  • Brands.volkswagen

Marka bilgisi native tarafta yol yardim ekrani gibi alanlarda kullanilir (brandId, brandName, phoneRoadHelp).

Ornek Projeyi Calistirma

cd example
flutter pub get
flutter run

CarPlay/Android Auto akisini test etmek icin:

  • iOS tarafinda CarPlay simulator veya destekli cihaz/provisioning
  • Android tarafinda Android Auto Desktop Head Unit (DHU) veya uyumlu cihaz

SSS / Sorun Giderme

CarPlay aciliyor ama veri gelmiyor

  • DtCarPlayService.init(...) uygulama baslangicinda cagrilmis olmali.
  • Donen JSON formatlari yukaridaki kontratla birebir uyumlu olmali.

Konum uyarisi ekrani cikiyor

  • iOS'ta Always konum izninin verildigini kontrol edin.
  • Gelistirme/simulator ortaminda gecici olarak ignoreLocationError: true kullanabilirsiniz.

Cold-start veya plugin register problemleri

  • FlutterHelper.shared.pluginRegistrant = { GeneratedPluginRegistrant.register(with: $0) } enjeksiyonunun hem uygulama acilisinda hem scene akisinda yapildigini dogrulayin.

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages