Theory
કૅમેરો બનાવ્યા વગર ફોટો
FestConnect Mobile ઇચ્છે છે કે users પોતાનો પ્રોફાઈલ ફોટો ઉમેરી શકે, કે event માં કોઈ તસવીર લઈ શકે. એ માટે કૅમેરો જોઈએ.
વહેંચણી વાળા (implicit intent વાળા) પાઠની જેમ જ, તમે તમારી app માં કૅમેરો બાંધતા નથી. એને બદલે તમે device માં પહેલેથી હાજર camera app ને ફોટો પાડીને પાછો સોંપવાનું કહો છો. આ એ જ 'બીજી apps સાથે સહકાર' વાળી ફિલસૂફી છે: સક્ષમ apps ને ફરી વાપરો, નવેસરથી બનાવો નહીં. આ છેલ્લો ટેક્નિકલ પાઠ MediaStore.ACTION_IMAGE_CAPTURE વડે છબી લેવાનું, કૅમેરો શરૂ કરવાનું અને પરિણામ મેળવવાનું આવરી લે છે, અને FestConnect Mobile ની device વાળી સુવિધાઓ પૂરી કરે છે.
Theory
ACTION_IMAGE_CAPTURE: camera app નો ફરી ઉપયોગ
ફોટો પાડવા માટે MediaStore.ACTION_IMAGE_CAPTURE ક્રિયા સાથે implicit intent મોકલો. એ device ની camera app ને શરૂ કરે છે; user તસવીર લે છે, અને પરિણામ તમારી activity પાસે પાછું આવે છે.
તમને કંઈક પાછું જોઈએ છે (ફોટો), એટલે તમે એને પરિણામની અપેક્ષા સાથે શરૂ કરો છો:
- પહેલાં
startActivityForResult(...)અનેonActivityResult(...)વપરાતાં - આધુનિક Android Activity Result APIs (
registerForActivityResult) વાપરે છે, જે વધુ સ્વચ્છ છે અને ભલામણ કરાયેલી રીત છે
પડાયેલી છબી કાં તો પરિણામના extras માં ("data" નામની key નીચે) નાના THUMBNAIL તરીકે પાછી આવે છે, અથવા આખા કદની છબી માટે તમે EXTRA_OUTPUT દ્વારા camera ને કહો છો કે એને ક્યાં સાચવવી (file નું URI, જે આધુનિક Android પર FileProvider દ્વારા અપાય છે). આ ફરી એક વાર એ જ implicit intent વાળી રીત છે: તમારી app ક્ષમતાને શરૂ કરે છે, camera app એ કામ કરે છે, અને પરિણામ પાછું આવે છે.
Practical
કૅમેરો શરૂ કરો અને ફોટો મેળવો
// આધુનિક રીત: camera ના પરિણામ માટે launcher નોંધાવો
val cameraLauncher = registerForActivityResult(
ActivityResultContracts.StartActivityForResult()
) { result ->
if (result.resultCode == Activity.RESULT_OK) {
// thumbnail extras માં "data" નીચે પાછું આવે છે:
val photo = result.data?.extras?.get("data") as? Bitmap
// ... ફોટો બતાવો કે સાચવો
}
}
fun takePhoto() {
// Implicit intent: device ની camera app ને છબી લેવાનું કહો
val intent = Intent(MediaStore.ACTION_IMAGE_CAPTURE)
cameraLauncher.launch(intent) // શરૂ કરો, પરિણામ callback માં પાછું આવે છે
}
// આખા કદની છબી માટે FileProvider ના URI સાથે EXTRA_OUTPUT ઉમેરો.
Quiz
FestConnect Mobile માં user ને ફોટો પડાવવા દેવાની સૌથી સાદી રીત કઈ છે?
- App ની અંદર જ શરૂઆતથી આખું camera નું interface બાંધવું
- MediaStore.ACTION_IMAGE_CAPTURE સાથે implicit intent મોકલીને device ની camera app શરૂ કરવી, અને ફોટો પરિણામ તરીકે પાછો મેળવવો
- camera સુધી પહોંચવું શક્ય જ નથી
- Internet પરથી ફોટો નકલ કરી લેવો
Show the answer
MediaStore.ACTION_IMAGE_CAPTURE સાથે implicit intent મોકલીને device ની camera app શરૂ કરવી, અને ફોટો પરિણામ તરીકે પાછો મેળવવો
સૌથી સાદી અને standard રીત એટલે MediaStore.ACTION_IMAGE_CAPTURE સાથે IMPLICIT intent મોકલવો, જે device માં પહેલેથી હાજર camera app ને શરૂ કરે છે; user ફોટો પાડે છે અને પરિણામ તમારી activity પાસે પાછું આવે છે (Activity Result APIs દ્વારા કે જૂના onActivityResult દ્વારા). આ સક્ષમ camera app ને ફરી વાપરે છે, નવેસરથી બનાવવાને બદલે, અને એ વહેંચણી જેવી જ 'બીજી apps સાથે સહકાર' વાળી રીત છે. વિકલ્પ A (શરૂઆતથી કૅમેરો બાંધવો) બહુ મોટું અને ભૂલભરેલું કામ છે, જે device પહેલેથી સારી રીતે કરે છે એની નકલ કરે છે, અને એ ફક્ત ખાસ, અદ્યતન camera ની જરૂર હોય ત્યાં જ જોઈએ. વિકલ્પ C ખોટો છે. વિકલ્પ D તો મુદ્દો જ ચૂકી જાય છે (અહીં છબી પાડવાની છે, download કરવાની નહીં). ACTION_IMAGE_CAPTURE દ્વારા camera app ને ફરી વાપરો અને પાછી આવેલી છબી સંભાળો.
Think first
camera અને વહેંચણી, બંને પાછળની એક જ રીત
વહેંચણી (અગાઉનો પાઠ) અને ફોટો પાડવો, બંને કામ implicit intents વડે બીજી app ને સોંપાય છે. આમાંથી Android નો કયો સામાન્ય રચનાનો સિદ્ધાંત દેખાય છે? વિચારીને પછી tap કરો.
Show the answer
સિદ્ધાંત આ છે: સુવિધાઓ નવેસરથી બનાવવાને બદલે implicit intents દ્વારા સક્ષમ apps ને ફરી વાપરવી. Android ની રચના જ એવી છે કે apps પોતાની ક્ષમતાઓ ખુલ્લી કરે (camera app છબી લઈ શકે; browser URLs ખોલી શકે; message ની app text મોકલી શકે), અને બીજી apps એ ક્ષમતાઓને implicit intents દ્વારા બોલાવે, અને એમને જોડવાનું કામ વ્યવસ્થા કરે. એટલે દરેક app પોતાનો કૅમેરો, browser કે વહેંચણીનું પાનું બાંધવાને બદલે apps એકબીજા સાથે સહકાર કરે છે: FestConnect ACTION_IMAGE_CAPTURE મોકલે છે અને user એ પસંદ કરેલી camera app કામ કરે છે, અને પછી પરિણામ પાછું આપે છે. ફાયદા: ઘણો ઓછો code (તમારે કૅમેરો બાંધવો પડતો નથી), એકસરખો અનુભવ (user ની જાણીતી camera app), user પાસે જે પણ apps હોય એ બધાંને આપોઆપ ટેકો, અને જવાબદારીઓનું સ્પષ્ટ વિભાજન. સારા Android વિકાસની આ જ ઓળખ છે: તમારી app પોતાના કામ પર (events સંભાળવા પર) ધ્યાન આપે અને ખાસ કામો (ફોટા, વહેંચણી, જોવું) એ કામ માટે બનેલી apps ને સોંપી દે. device ની ક્ષમતાઓને ગોઠવો; એમની નકલ ન કરો.
Watch out
camera થી છબી લેવાના ફાંદા
નકામો કૅમેરો બાંધવો: સાદા ફોટા માટે ACTION_IMAGE_CAPTURE અને camera app વાપરો.
Result code અવગણવો: ફોટો વાપરતાં પહેલાં RESULT_OK તપાસો (user રદ પણ કરી શકે).
Thumbnail સામે આખી છબી: extras માંનું "data" નાનું thumbnail આપે છે; આખા કદ માટે EXTRA_OUTPUT અને FileProvider નું URI વાપરો.
આધુનિક Android પર FileProvider: કાચું file નું URI આપવાથી નવા Android પર app ભાંગી શકે છે; FileProvider વાપરો.
કોઈ camera app જ ન હોય: ભાગ્યે જ બને, પણ મજબૂત apps એવો કિસ્સો પણ સંભાળે છે જ્યાં કોઈ camera app હાજર ન હોય.
Theory
Unit 3 પૂરો: પૂરેપૂરી mobile app
Kotlin માં લખાયેલી FestConnect Mobile હવે સુવિધાઓની દૃષ્ટિએ પૂરી છે: એ server પરથી આવતું JSON parse કરે છે, intents વડે અનેક screens વચ્ચે ફરે છે, વહેંચણી કરે છે અને URLs ખોલે છે, SQLite માં data store કરે છે, અને સ્થાન તથા કૅમેરો વાપરે છે, એટલે કે એ ખરી, data પર ચાલતી, device થી વાકેફ Android app છે. Mobile વિકાસનો ચાપ આટલેથી પૂરો. Unit 4 અલગ છે: એ લીલાવતી માંથી Indian Knowledge System નું ગણિત છે, જે તથ્યના આધારે ભણાવાય છે, અને એ જ ગણિતવાળો unit BCA503-01 સાથે વહેંચાયેલો છે. App બંધાઈ ગઈ; IKS વાળો unit અલગ ઊભો છે.
Summary
Key takeaways
- ફોટો પાડવા માટે MediaStore.ACTION_IMAGE_CAPTURE સાથે implicit intent મોકલો, જે device ની camera app શરૂ કરે છે.
- એને પરિણામની અપેક્ષા સાથે શરૂ કરાય છે: આધુનિક Android Activity Result APIs (registerForActivityResult) વાપરે છે; જૂનો code startActivityForResult અને onActivityResult વાપરતો.
- Thumbnail વાળું bitmap પરિણામના extras માં "data" નીચે પાછું આવે છે; આખા કદની છબી માટે EXTRA_OUTPUT આપો (FileProvider દ્વારા file નું URI).
- ફોટો વાપરતાં પહેલાં RESULT_OK તપાસો (user રદ પણ કરી શકે).
- આ કૅમેરો બાંધવાને બદલે camera app ને ફરી વાપરે છે: વહેંચણી જેવી જ implicit intent વાળી, બીજી apps સાથે સહકારની રીત.
- સામાન્ય સિદ્ધાંત: બીજી apps ની ક્ષમતાઓની નકલ કરવાને બદલે એમને implicit intents દ્વારા બોલાવો.
- યાદ રાખવાની કડી: ACTION_IMAGE_CAPTURE camera app ને કહે છે; અને ફોટો પરિણામ તરીકે પાછો આવે છે.