এই নথিটি বেশ কয়েকটি সাধারণ ব্যবহারের ক্ষেত্রে উপস্থাপন করে যেখানে একটি অ্যাপ অন্যান্য অ্যাপের সাথে ইন্টারঅ্যাক্ট করে। প্রতিটি বিভাগ সীমিত প্যাকেজ দৃশ্যমানতার সাথে অ্যাপের কার্যকারিতা কীভাবে সম্পন্ন করা যায় সে সম্পর্কে নির্দেশিকা প্রদান করে, যা আপনার অ্যাপটি Android 11 (API স্তর 30) বা তার বেশি লক্ষ্য করে কিনা তা বিবেচনা করতে হবে।
অ্যান্ড্রয়েড 11 বা উচ্চতরকে লক্ষ্য করে এমন একটি অ্যাপ যখন অন্য অ্যাপে একটি অ্যাক্টিভিটি শুরু করার জন্য একটি অভিপ্রায় ব্যবহার করে, তখন সবচেয়ে সহজ পদ্ধতি হল অভিপ্রায়কে আহ্বান করা এবং কোনো অ্যাপ উপলব্ধ না থাকলে ActivityNotFoundException
ব্যতিক্রম পরিচালনা করা।
যদি আপনার অ্যাপের অংশটি startActivity()
এ কল সফল হতে পারে কিনা তা জানার উপর নির্ভর করে, যেমন একটি UI দেখানো, আপনার অ্যাপের ম্যানিফেস্টের <queries>
এলিমেন্টে একটি উপাদান যোগ করুন। সাধারণত, এটি একটি <intent>
উপাদান।
ইউআরএল খুলুন
এই বিভাগটি Android 11 বা উচ্চতরকে লক্ষ্য করে এমন একটি অ্যাপে URL খোলার বিভিন্ন উপায় বর্ণনা করে।
ব্রাউজার বা অন্য অ্যাপে ইউআরএল খুলুন
একটি URL খুলতে, একটি উদ্দেশ্য ব্যবহার করুন যাতে ACTION_VIEW
অভিপ্রায় ক্রিয়া রয়েছে, যেমন একটি ওয়েব URL লোড করার নির্দেশিকাতে বর্ণিত হয়েছে৷ আপনি এই অভিপ্রায় ব্যবহার করে startActivity()
কল করার পরে, নিম্নলিখিতগুলির মধ্যে একটি ঘটবে:
- URLটি একটি ওয়েব ব্রাউজার অ্যাপে খোলে।
- URLটি একটি অ্যাপে খোলে যা URLটিকে একটি গভীর লিঙ্ক হিসাবে সমর্থন করে৷
- একটি দ্ব্যর্থতা নিরসন ডায়ালগ উপস্থিত হয়, যা ব্যবহারকারীকে বেছে নিতে দেয় কোন অ্যাপটি ইউআরএল খুলবে৷
একটি
ActivityNotFoundException
ঘটে কারণ ডিভাইসে এমন কোনো অ্যাপ ইনস্টল করা নেই যা URL খুলতে পারে। (এটি অস্বাভাবিক।)এটি বাঞ্ছনীয় যে আপনার অ্যাপ
ActivityNotFoundException
ধরতে এবং পরিচালনা করে যদি এটি ঘটে থাকে।
যেহেতু startActivity()
পদ্ধতিতে অন্য অ্যাপ্লিকেশনের কার্যকলাপ শুরু করার জন্য প্যাকেজ দৃশ্যমানতার প্রয়োজন হয় না, তাই আপনাকে আপনার অ্যাপের ম্যানিফেস্টে একটি <queries>
উপাদান যোগ করতে বা বিদ্যমান <queries>
উপাদানে কোনো পরিবর্তন করতে হবে না। এটি একটি URL খোলে অন্তর্নিহিত এবং স্পষ্ট অভিপ্রায় উভয়ের জন্যই সত্য।
একটি ব্রাউজার উপলব্ধ কিনা পরীক্ষা করুন
কিছু ক্ষেত্রে, ইউআরএল খোলার চেষ্টা করার আগে আপনার অ্যাপ ডিভাইসে অন্তত একটি ব্রাউজার উপলব্ধ আছে বা একটি নির্দিষ্ট ব্রাউজার ডিফল্ট ব্রাউজার তা যাচাই করতে চাইতে পারে। এই ক্ষেত্রে, আপনার ম্যানিফেস্টের <queries>
উপাদানের অংশ হিসাবে নিম্নলিখিত <intent>
উপাদানটি অন্তর্ভুক্ত করুন:
<!-- Place inside the <queries> element. --> <intent> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.BROWSABLE" /> <data android:scheme="https" /> </intent>
আপনি যখন queryIntentActivities()
কল করেন এবং একটি আর্গুমেন্ট হিসাবে একটি ওয়েব উদ্দেশ্য পাস করেন, তখন প্রত্যাবর্তিত তালিকায় কিছু ক্ষেত্রে উপলব্ধ ব্রাউজার অ্যাপগুলি অন্তর্ভুক্ত থাকে। ব্যবহারকারী যদি ডিফল্টরূপে একটি নন-ব্রাউজার অ্যাপে খোলার জন্য ইউআরএল কনফিগার করে থাকেন তবে তালিকায় ব্রাউজার অ্যাপ অন্তর্ভুক্ত করা হয় না।
কাস্টম ট্যাবে URL খুলুন
কাস্টম ট্যাবগুলি একটি অ্যাপকে ব্রাউজারটি কেমন দেখায় এবং কেমন লাগে তা কাস্টমাইজ করতে দেয়৷ আপনি আপনার অ্যাপ ম্যানিফেস্টে <queries>
উপাদান যোগ বা পরিবর্তন করার প্রয়োজন ছাড়াই একটি কাস্টম ট্যাবে একটি URL খুলতে পারেন।
যাইহোক, আপনি ডিভাইসটিতে কাস্টম ট্যাব সমর্থন করে এমন একটি ব্রাউজার আছে কিনা তা পরীক্ষা করতে চাইতে পারেন বা CustomTabsClient.getPackageName()
ব্যবহার করে কাস্টম ট্যাবগুলির সাথে চালু করার জন্য একটি নির্দিষ্ট ব্রাউজার নির্বাচন করতে পারেন। এই ক্ষেত্রে, আপনার ম্যানিফেস্টের <queries>
উপাদানের অংশ হিসাবে নিম্নলিখিত <intent>
উপাদানটি অন্তর্ভুক্ত করুন:
<!-- Place inside the <queries> element. --> <intent> <action android:name="android.support.customtabs.action.CustomTabsService" /> </intent>
নন-ব্রাউজার অ্যাপ্লিকেশানগুলিকে URLগুলি পরিচালনা করতে দিন৷
এমনকি যদি আপনার অ্যাপ কাস্টম ট্যাব ব্যবহার করে ইউআরএল খুলতে পারে, তাহলে এটি সুপারিশ করা হয় যে আপনি যদি সম্ভব হয় তাহলে একটি নন-ব্রাউজার অ্যাপকে একটি URL খুলতে দিন। আপনার অ্যাপে এই ক্ষমতা প্রদান করতে, FLAG_ACTIVITY_REQUIRE_NON_BROWSER
অভিপ্রায় ফ্ল্যাগ সেট করে এমন একটি অভিপ্রায় ব্যবহার করে startActivity()
এ কল করার চেষ্টা করুন৷ যদি সিস্টেমটি একটি ActivityNotFoundException
নিক্ষেপ করে, তাহলে আপনার অ্যাপটি একটি কাস্টম ট্যাবে URL খুলতে পারে।
যদি একটি অভিপ্রায় এই পতাকাটি অন্তর্ভুক্ত করে, startActivity()
এ একটি কলের ফলে একটি ActivityNotFoundException
নিক্ষিপ্ত হবে যখন নিম্নলিখিত শর্তগুলির মধ্যে একটি ঘটে:
- কলটি সরাসরি একটি ব্রাউজার অ্যাপ চালু করত।
- কলটি ব্যবহারকারীকে একটি দ্ব্যর্থতাহীন ডায়ালগ দেখাবে যেখানে একমাত্র বিকল্পগুলি হল ব্রাউজার অ্যাপ।
নিম্নলিখিত কোড স্নিপেট দেখায় কিভাবে FLAG_ACTIVITY_REQUIRE_NON_BROWSER
উদ্দেশ্য পতাকা ব্যবহার করার জন্য আপনার যুক্তি আপডেট করতে হয়:
কোটলিন
try { val intent = Intent(ACTION_VIEW, Uri.parse(url)).apply { // The URL should either launch directly in a non-browser app (if it's // the default) or in the disambiguation dialog. addCategory(CATEGORY_BROWSABLE) flags = FLAG_ACTIVITY_NEW_TASK or FLAG_ACTIVITY_REQUIRE_NON_BROWSER } startActivity(intent) } catch (e: ActivityNotFoundException) { // Only browser apps are available, or a browser is the default. // So you can open the URL directly in your app, for example in a // Custom Tab. openInCustomTabs(url) }
জাভা
try { Intent intent = new Intent(ACTION_VIEW, Uri.parse(url)); // The URL should either launch directly in a non-browser app (if it's the // default) or in the disambiguation dialog. intent.addCategory(CATEGORY_BROWSABLE); intent.setFlags(FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_REQUIRE_NON_BROWSER); startActivity(intent); } catch (ActivityNotFoundException e) { // Only browser apps are available, or a browser is the default. // So you can open the URL directly in your app, for example in a // Custom Tab. openInCustomTabs(url); }
একটি দ্ব্যর্থতা সংলাপ এড়িয়ে চলুন
আপনি যদি দ্ব্যর্থতা নিরসনের ডায়ালগ দেখানো এড়াতে চান যা ব্যবহারকারীরা একটি URL খুললে দেখতে পারে এবং পরিবর্তে এই পরিস্থিতিতে নিজেই URLটি পরিচালনা করতে পছন্দ করে, আপনি একটি উদ্দেশ্য ব্যবহার করতে পারেন যা FLAG_ACTIVITY_REQUIRE_DEFAULT
অভিপ্রায় ফ্ল্যাগ সেট করে৷
যদি একটি অভিপ্রায় এই পতাকাটি অন্তর্ভুক্ত করে, তাহলে startActivity()
একটি কলের ফলে একটি ActivityNotFoundException
থ্রো করা হবে যখন কলটি ব্যবহারকারীকে একটি দ্ব্যর্থতা নিরসন ডায়ালগ দেখাবে৷
যদি একটি অভিপ্রায় এই পতাকা এবং FLAG_ACTIVITY_REQUIRE_NON_BROWSER
অভিপ্রায় পতাকা উভয়ই অন্তর্ভুক্ত করে, তাহলে startActivity()
এ একটি কলের ফলে নিম্নলিখিত শর্তগুলির মধ্যে যেকোনো একটি ঘটলে একটি ActivityNotFoundException
নিক্ষেপ করা হবে:
- কলটি সরাসরি ব্রাউজার অ্যাপটি চালু করত।
- কলটি ব্যবহারকারীকে একটি দ্ব্যর্থতাহীন ডায়ালগ দেখাবে।
নিম্নলিখিত কোড স্নিপেট দেখায় কিভাবে FLAG_ACTIVITY_REQUIRE_NON_BROWSER
এবং FLAG_ACTIVITY_REQUIRE_DEFAULT
পতাকা একসাথে ব্যবহার করতে হয়:
কোটলিন
val url = URL_TO_LOAD try { // For this intent to be invoked, the system must directly launch a // non-browser app. val intent = Intent(ACTION_VIEW, Uri.parse(url)).apply { addCategory(CATEGORY_BROWSABLE) flags = FLAG_ACTIVITY_NEW_TASK or FLAG_ACTIVITY_REQUIRE_NON_BROWSER or FLAG_ACTIVITY_REQUIRE_DEFAULT } startActivity(intent) } catch (e: ActivityNotFoundException) { // This code executes in one of the following cases: // 1. Only browser apps can handle the intent. // 2. The user has set a browser app as the default app. // 3. The user hasn't set any app as the default for handling this URL. openInCustomTabs(url) }
জাভা
String url = URL_TO_LOAD; try { // For this intent to be invoked, the system must directly launch a // non-browser app. Intent intent = new Intent(ACTION_VIEW, Uri.parse(url)); intent.addCategory(CATEGORY_BROWSABLE); intent.setFlags(FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_REQUIRE_NON_BROWSER | FLAG_ACTIVITY_REQUIRE_DEFAULT); startActivity(intent); } catch (ActivityNotFoundException e) { // This code executes in one of the following cases: // 1. Only browser apps can handle the intent. // 2. The user has set a browser app as the default app. // 3. The user hasn't set any app as the default for handling this URL. openInCustomTabs(url); }
একটি ফাইল খুলুন
যদি আপনার অ্যাপ ফাইল বা অ্যাটাচমেন্ট পরিচালনা করে, যেমন একটি ডিভাইস প্রদত্ত ফাইল খুলতে পারে কিনা তা পরীক্ষা করা, সাধারণত ফাইলটি পরিচালনা করতে পারে এমন একটি কার্যকলাপ শুরু করার চেষ্টা করা সবচেয়ে সহজ। এটি করার জন্য, একটি অভিপ্রায় ব্যবহার করুন যাতে ACTION_VIEW
অভিপ্রায় ক্রিয়া এবং URI যেটি নির্দিষ্ট ফাইলের প্রতিনিধিত্ব করে। ডিভাইসে কোনো অ্যাপ উপলব্ধ না থাকলে, আপনার অ্যাপ ActivityNotFoundException
ধরতে পারে। আপনার ব্যতিক্রম-হ্যান্ডলিং যুক্তিতে, আপনি হয় একটি ত্রুটি দেখাতে পারেন বা ফাইলটি নিজে পরিচালনা করার চেষ্টা করতে পারেন।
যদি আপনার অ্যাপটিকে আগে থেকেই জানতে হয় যে অন্য অ্যাপ একটি প্রদত্ত ফাইল খুলতে পারে কিনা, তাহলে আপনার ম্যানিফেস্টের <queries>
উপাদানের অংশ হিসাবে নিম্নলিখিত কোড স্নিপেটে <intent>
উপাদানটি অন্তর্ভুক্ত করুন। ফাইলের ধরনটি অন্তর্ভুক্ত করুন যদি আপনি ইতিমধ্যেই জানেন যে এটি কম্পাইলের সময় কী।
<!-- Place inside the <queries> element. --> <intent> <action android:name="android.intent.action.VIEW" /> <!-- If you don't know the MIME type in advance, set "mimeType" to "*/*". --> <data android:mimeType="application/pdf" /> </intent>
তারপরে আপনি আপনার অভিপ্রায়ের সাথে resolveActivity()
কল করে একটি অ্যাপ উপলব্ধ কিনা তা পরীক্ষা করতে পারেন।
URI অ্যাক্সেস মঞ্জুর করুন
দ্রষ্টব্য: এই বিভাগে বর্ণিত ইউআরআই অ্যাক্সেস অনুমতিগুলি ঘোষণা করা অ্যাপ্লিকেশানগুলির জন্য প্রয়োজনীয় যেগুলি Android 11 (API স্তর 30) বা উচ্চতরকে লক্ষ্য করে এবং সমস্ত অ্যাপের জন্য সুপারিশ করা হয়, তাদের লক্ষ্য SDK সংস্করণ নির্বিশেষে এবং তারা তাদের সামগ্রী সরবরাহকারীকে রপ্তানি করে কিনা।
কন্টেন্ট URI অ্যাক্সেস করার জন্য Android 11 বা উচ্চতর অ্যাপগুলিকে লক্ষ্য করে, আপনার অ্যাপ্লিকেশানের অভিপ্রায়কে অবশ্যই নিম্নলিখিত একটি বা উভয়টি অভিপ্রায় ফ্ল্যাগ সেট করে URI অ্যাক্সেস অনুমতিগুলি ঘোষণা করতে হবে: FLAG_GRANT_READ_URI_PERMISSION
এবং FLAG_GRANT_WRITE_URI_PERMISSION
।
অ্যান্ড্রয়েড 11 এবং উচ্চতর সংস্করণে, ইউআরআই অ্যাক্সেসের অনুমতিগুলি অভিপ্রায় গ্রহণকারী অ্যাপকে নিম্নলিখিত ক্ষমতা দেয়:
- প্রদত্ত URI অনুমতিগুলির উপর নির্ভর করে, সামগ্রী URI প্রতিনিধিত্ব করে এমন ডেটা থেকে পড়ুন বা লিখুন।
- ইউআরআই কর্তৃপক্ষের সাথে মেলে এমন সামগ্রী প্রদানকারী ধারণকারী অ্যাপটিতে দৃশ্যমানতা অর্জন করুন। যে অ্যাপটিতে বিষয়বস্তু প্রদানকারী রয়েছে সেটি উদ্দেশ্য পাঠানোর অ্যাপ থেকে আলাদা হতে পারে।
নিম্নলিখিত কোড স্নিপেটটি দেখায় যে কীভাবে একটি URI অনুমতির অভিপ্রায় ফ্ল্যাগ যুক্ত করতে হয় যাতে Android 11 বা উচ্চতরকে লক্ষ্য করে এমন অন্য অ্যাপটি URI-তে থাকা ডেটা দেখতে পারে:
কোটলিন
val shareIntent = Intent(Intent.ACTION_VIEW).apply { flags = Intent.FLAG_GRANT_READ_URI_PERMISSION data = CONTENT_URI_TO_SHARE_WITH_OTHER_APP }
জাভা
Intent shareIntent = new Intent(Intent.ACTION_VIEW); shareIntent.setFlags(FLAG_GRANT_READ_URI_PERMISSION); shareIntent.setData(CONTENT_URI_TO_SHARE_WITH_OTHER_APP);
পরিষেবাগুলির সাথে সংযোগ করুন
যদি আপনার অ্যাপের এমন একটি পরিষেবার সাথে ইন্টারঅ্যাক্ট করতে হয় যা স্বয়ংক্রিয়ভাবে দৃশ্যমান নয়, আপনি একটি <queries>
উপাদানের মধ্যে উপযুক্ত অভিপ্রায় ক্রিয়া ঘোষণা করতে পারেন। নিম্নলিখিত বিভাগগুলি সাধারণভাবে অ্যাক্সেস করা পরিষেবাগুলি ব্যবহার করে উদাহরণ দেয়৷
একটি টেক্সট-টু-স্পীচ ইঞ্জিনের সাথে সংযোগ করুন
যদি আপনার অ্যাপ একটি টেক্সট-টু-স্পিচ (TTS) ইঞ্জিনের সাথে ইন্টারঅ্যাক্ট করে, তাহলে আপনার ম্যানিফেস্টে <queries>
উপাদানের অংশ হিসাবে নিম্নলিখিত <intent>
উপাদানটি অন্তর্ভুক্ত করুন:
<!-- Place inside the <queries> element. --> <intent> <action android:name="android.intent.action.TTS_SERVICE" /> </intent>
একটি স্পিচ রিকগনিশন সার্ভিসের সাথে সংযোগ করুন
আপনার অ্যাপ যদি কোনো স্পিচ রিকগনিশন সার্ভিসের সাথে ইন্টারঅ্যাক্ট করে, তাহলে আপনার ম্যানিফেস্টে <queries>
উপাদানের অংশ হিসেবে নিম্নলিখিত <intent>
উপাদানটি অন্তর্ভুক্ত করুন:
<!-- Place inside the <queries> element. --> <intent> <action android:name="android.speech.RecognitionService" /> </intent>
মিডিয়া ব্রাউজার পরিষেবাগুলিতে সংযোগ করুন৷
যদি আপনার অ্যাপটি একটি ক্লায়েন্ট মিডিয়া ব্রাউজার অ্যাপ হয়, তাহলে আপনার ম্যানিফেস্টে <queries>
উপাদানের অংশ হিসেবে নিম্নলিখিত <intent>
উপাদানটি অন্তর্ভুক্ত করুন:
<!-- Place inside the <queries> element. --> <intent> <action android:name="android.media.browse.MediaBrowserService" /> </intent>
কাস্টম কার্যকারিতা প্রদান
যদি আপনার অ্যাপটিকে কাস্টমাইজযোগ্য ক্রিয়া সম্পাদন করতে হয় বা অন্যান্য অ্যাপের সাথে এর ইন্টারঅ্যাকশনের উপর ভিত্তি করে কাস্টমাইজযোগ্য তথ্য দেখাতে হয়, তাহলে আপনি আপনার ম্যানিফেস্টের <queries>
উপাদানের অংশ হিসাবে অভিপ্রায় ফিল্টার স্বাক্ষর ব্যবহার করে সেই কাস্টম আচরণ উপস্থাপন করতে পারেন। নিম্নলিখিত বিভাগগুলি বিভিন্ন সাধারণ পরিস্থিতিতে বিস্তারিত নির্দেশিকা প্রদান করে।
এসএমএস অ্যাপের জন্য ক্যোয়ারী
আপনার অ্যাপের যদি কোনও ডিভাইসে ইনস্টল করা এসএমএস অ্যাপগুলির সেট সম্পর্কে তথ্যের প্রয়োজন হয়, উদাহরণস্বরূপ কোন অ্যাপটি ডিভাইসের ডিফল্ট এসএমএস হ্যান্ডলার তা পরীক্ষা করতে, আপনার ম্যানিফেস্টে <queries>
উপাদানের অংশ হিসাবে নিম্নলিখিত <intent>
উপাদানটি অন্তর্ভুক্ত করুন:
<!-- Place inside the <queries> element. --> <intent> <action android:name="android.intent.action.SENDTO"/> <data android:scheme="smsto" android:host="*" /> </intent>
একটি কাস্টম শেয়ারশীট তৈরি করুন
যখনই সম্ভব, একটি সিস্টেম-প্রদত্ত শেয়ারশীট ব্যবহার করুন। বিকল্পভাবে, আপনার ম্যানিফেস্টে <queries>
উপাদানের অংশ হিসাবে নিম্নলিখিত <intent>
উপাদানটি অন্তর্ভুক্ত করুন:
<!-- Place inside the <queries> element. --> <intent> <action android:name="android.intent.action.SEND" /> <!-- Replace with the MIME type that your app works with, if needed. --> <data android:mimeType="image/jpeg" /> </intent>
আপনার অ্যাপের যুক্তিতে শেয়ারশীট তৈরি করার প্রক্রিয়া, যেমন কল টু queryIntentActivities()
, অন্যথায় Android 11-এর আগের সংস্করণগুলির তুলনায় অপরিবর্তিত থাকে।
কাস্টম টেক্সট নির্বাচন কর্ম দেখান
যখন ব্যবহারকারীরা আপনার অ্যাপে পাঠ্য নির্বাচন করেন, তখন একটি পাঠ্য নির্বাচন টুলবার নির্বাচিত পাঠ্যটিতে সম্পাদন করার জন্য সম্ভাব্য ক্রিয়াকলাপগুলির সেট দেখায়। যদি এই টুলবারটি অন্যান্য অ্যাপ থেকে কাস্টম অ্যাকশন দেখায়, তাহলে আপনার ম্যানিফেস্টের <queries>
উপাদানের অংশ হিসেবে নিম্নলিখিত <intent>
উপাদানটি অন্তর্ভুক্ত করুন:
<!-- Place inside the <queries> element. --> <intent> <action android:name="android.intent.action.PROCESS_TEXT" /> <data android:mimeType="text/plain" /> </intent>
একটি পরিচিতির জন্য কাস্টম ডেটা সারি দেখান
অ্যাপগুলি পরিচিতি প্রদানকারীতে কাস্টম ডেটা সারি যোগ করতে পারে। এই কাস্টম ডেটা দেখানোর জন্য একটি পরিচিতি অ্যাপের জন্য, এটি নিম্নলিখিতগুলি করতে সক্ষম হতে হবে:
- অন্যান্য অ্যাপ থেকে
contacts.xml
ফাইল পড়ুন। - কাস্টম MIME প্রকারের সাথে সম্পর্কিত একটি আইকন লোড করুন৷
যদি আপনার অ্যাপটি একটি পরিচিতি অ্যাপ হয়, তাহলে আপনার ম্যানিফেস্টে <queries>
উপাদানের অংশ হিসাবে নিম্নলিখিত <intent>
উপাদানগুলি অন্তর্ভুক্ত করুন:
<!-- Place inside the <queries> element. --> <!-- Lets the app read the contacts.xml file from other apps. --> <intent> <action android:name="android.accounts.AccountAuthenticator" /> </intent> <!-- Lets the app load an icon corresponding to the custom MIME type. --> <intent> <action android:name="android.intent.action.VIEW" /> <data android:scheme="content" android:host="com.android.contacts" android:mimeType="vnd.android.cursor.item/*" /> </intent>