Theory
वह App जो जानना चाहता था आप कहाँ हैं
FestConnect Mobile के पास एक nice feature idea है: user के सबसे NEAREST fest venues दिखाना। इसके लिए phone की LOCATION चाहिए।
पर location deeply personal है, तो Android इसे बस हाथ में नहीं दे देता। App को DECLARE करना पड़ता है कि इसे location चाहिए, runtime पर user से ASK करना पड़ता है, और उनकी explicit CONSENT पानी पड़ती है, और gracefully 'no' accept करना पड़ता है। यह lesson user की current location सही, privacy-respecting तरीके से access करना cover करता है। Technical part short है; PERMISSION part real lesson है, और यह उन UX-and-trust principles को reflect करता है जिनसे आप BCA402-02 में मिले।
Theory
Permissions: Declare कीजिए, फिर Runtime पर Request कीजिए
Location एक dangerous (sensitive) permission है, तो इसे access करने के लिए दो steps चाहिए:
- इसे manifest में declare कीजिए:
ACCESS_FINE_LOCATION(precise, GPS) याACCESS_COARSE_LOCATION(approximate, network-based) - इसे RUNTIME पर request कीजिए (Android 6.0 से required): user को एक permission dialog दिखाइए जिसे वे GRANT या DENY कर सकें
Location इस्तेमाल करने से पहले आपको check करना पड़ता है permission granted है या नहीं (ContextCompat.checkSelfPermission), और अगर नहीं, इसे request कीजिए, और एक DENIAL gracefully handle कीजिए (feature बस काम नहीं करेगा, और app को nicely degrade करना चाहिए, crash नहीं)। Modern Android पर सिर्फ़ declare करना काफ़ी नहीं है; sensitive permissions के लिए user की runtime consent mandatory है।
Practical
Permission Check/Request कीजिए, फिर Location पाइए
// 1. Manifest declares ACCESS_FINE_LOCATION
// 2. Check at runtime; request if not granted
fun ensureLocationPermission() {
if (ContextCompat.checkSelfPermission(this,
Manifest.permission.ACCESS_FINE_LOCATION)
!= PackageManager.PERMISSION_GRANTED) {
// Not granted: ask the user
requestPermissions(
arrayOf(Manifest.permission.ACCESS_FINE_LOCATION), 100)
} else {
getLocation() // already granted
}
}
// 3. Get the location (async, via Google Play Services)
fun getLocation() {
val client = LocationServices.getFusedLocationProviderClient(this)
client.lastLocation.addOnSuccessListener { loc ->
if (loc != null) {
val lat = loc.latitude
val lng = loc.longitude // use lat/lng to show nearby venues
}
}
}
Theory
Location पाना, और Coarse बनाम Fine
Location पढ़ने का modern तरीका FusedLocationProviderClient है (Google Play Services से), जो GPS, wifi और network signals को intelligently combine करता है। client.lastLocation last known Location (latitude और longitude के साथ) एक callback से देता है, ASYNCHRONOUSLY, result बाद में आता है, तुरंत नहीं।
दो precision levels:
- coarse (ACCESS_COARSE_LOCATION): approximate, network-based, कम battery, 'कौन सा city/area' के लिए काफ़ी अच्छा
- fine (ACCESS_FINE_LOCATION): precise, GPS, ज़्यादा battery, exact positioning के लिए
सिर्फ़ वह precision REQUEST कीजिए जो आपको चाहिए: अगर FestConnect को बस nearby CITY के venues चाहिए, coarse काफ़ी है और fine GPS demand करने से ज़्यादा user की battery और privacy respect करता है।
Quiz
एक Android app को user की current location access करने से पहले क्या करना पड़ता है?
- कुछ नहीं; location सारे apps को freely available है
- Manifest में location permission declare कीजिए AND इसे runtime पर request कीजिए, check करते हुए user ने इसे grant किया (और denial handle कीजिए)
- सिर्फ़ इसे manifest में declare कीजिए; वह काफ़ी है
- App install होने पर सिर्फ़ एक बार पूछिए
Show the answer
Manifest में location permission declare कीजिए AND इसे runtime पर request कीजिए, check करते हुए user ने इसे grant किया (और denial handle कीजिए)
Location एक sensitive (dangerous) permission है, तो एक app को इसे manifest में declare AND RUNTIME पर (Android 6.0 से) request दोनों करने पड़ते हैं, location इस्तेमाल करने से पहले check करते हुए user ने इसे grant किया और denial को gracefully handle करते हुए। Option A false है और एक serious privacy violation होता, sensitive data कभी freely available नहीं होता। Option C pre-Android-6.0 model है: सिर्फ़ declare करना अब काफ़ी नहीं है; dangerous permissions के लिए runtime consent required है। Option D old install-time model describe करता है जिसे modern Android ने runtime requests से replace किया (तो users context में decide करते हैं, और बाद में revoke कर सकते हैं)। Rule: declare + runtime पर request + granted check + 'no' handle कीजिए, क्योंकि user को उनकी location जैसा sensitive data share करने के लिए consent देनी चाहिए।
Think first
Trust के लिए Runtime Permissions क्यों Matter करती हैं
पुराना Android install time पर सारी declared permissions grant करता था; modern Android runtime पर, context में पूछता है। Runtime model users के लिए बेहतर क्यों है, BCA402-02 के UX principles से connect करते हुए? फिर tap कीजिए।
Show the answer
Runtime model users को MEANINGFUL CONTROL देता है और TRUST build करता है। Install time पर, permissions एक all-or-nothing text की wall थीं जिसे कोई नहीं पढ़ता था, और app इस्तेमाल करने के लिए आपको सब कुछ grant करना पड़ता था, तो consent hollow थी। Runtime requests एक sensitive permission तब माँगते हैं जब यह actually चाहिए और CONTEXT में ('FestConnect nearby venues दिखाने के लिए आपकी location चाहता है'), तो user समझता है WHY और एक INFORMED choice कर सकता है, grant करना, deny करना, या एक बार grant करना। वे इसे बाद में settings में REVOKE भी कर सकते हैं। यह user autonomy और privacy respect करता है, और एक well-behaved app EXPLAIN करता है इसे एक permission क्यों चाहिए और denied होने पर gracefully DEGRADE करता है (nearby-venues feature बस appear नहीं होता), nag करने या break करने की बजाय। यह exactly BCA402-02 का UX-and-trust principle है: user को respect कीजिए, transparent रहिए, और आपको जो चाहिए उससे ज़्यादा कभी demand मत कीजिए। Runtime permissions consent को एक formality से एक real, contextual choice में बदलते हैं, जो ज़्यादा ethical AND बेहतर UX दोनों है।
Watch out
Location Traps
Declare करना पर Runtime पर Request न करना: modern Android पर आपको sensitive permissions runtime पर request करनी पड़ती हैं, सिर्फ़ declare करना काफ़ी नहीं।
Denial Handle न करना: अगर user 'no' कहे, feature को gracefully degrade करना चाहिए, crash नहीं।
Location को Instant Assume करना: यह एक callback के through asynchronously आता है; result को वहाँ handle कीजिए, और null case को।
Coarse काफ़ी होने पर भी Fine Demand करना: सिर्फ़ वह precision request कीजिए जो चाहिए (battery, privacy, trust)।
क्यों Explain न करना: user को बताइए आपको location क्यों चाहिए, context में; यह grant rates और trust improve करता है।
Theory
Location हो गई; एक Device Power बाकी
FestConnect Mobile user की consent से, nearby venues दिखाने के लिए उनकी location ढूँढ सकता है। Unit का final device feature, और आख़िरी technical lesson, CAMERA है: camera app को एक implicit intent के through device camera इस्तेमाल करके एक image capture करना। फिर Unit 4 IKS Lilavati mathematics की तरफ़ मुड़ता है। App अपनी last capability पाता है, फिर subject का mathematics unit।
Summary
Key takeaways
- Location एक sensitive (dangerous) permission है: app को इसे manifest में declare AND runtime पर request करना पड़ता है।
- ACCESS_FINE_LOCATION (precise, GPS) या ACCESS_COARSE_LOCATION (approximate, network) declare कीजिए; सिर्फ़ चाहिए वाली precision request कीजिए।
- Runtime (Android 6.0 से): ContextCompat.checkSelfPermission check कीजिए, granted न होने पर request कीजिए, denial gracefully handle कीजिए।
- FusedLocationProviderClient (Google Play Services) से location पाइए; lastLocation asynchronously एक Location (latitude/longitude) देता है।
- Result एक callback (async) है और null हो सकता है; दोनों handle कीजिए।
- Runtime, in-context permissions user trust और control respect करती हैं (BCA402-02 UX): क्यों explain कीजिए, denied होने पर gracefully degrade कीजिए।
- Memory hook: declare + runtime पर request + granted check + 'no' handle कीजिए; location देना user का choice है।