এই ডকুমেন্টে এমন কিছু সাধারণ ব্যবহারের উদাহরণ দেওয়া হয়েছে যেখানে একটি অ্যাপ অন্য অ্যাপের সাথে ইন্টার্যাক্ট করে। প্রতিটি বিভাগ সীমিত প্যাকেজ দৃশ্যমানতার সাথে অ্যাপের কার্যকারিতা কীভাবে সম্পন্ন করা যায় সে সম্পর্কে নির্দেশিকা প্রদান করে, যা আপনার অ্যাপ Android ১১ (API লেভেল ৩০) বা তার পরবর্তী ভার্সনকে টার্গেট করলে আপনাকে বিবেচনা করতে হবে।
Android 11 বা তার পরবর্তী ভার্সনকে টার্গেট করে এমন কোনও অ্যাপ যখন অন্য কোনও অ্যাপে অ্যাক্টিভিটি শুরু করার জন্য ইনটেন্ট ব্যবহার করে, তখন সবচেয়ে সহজ উপায় হল ইনটেন্টকে কল করা এবং কোনও অ্যাপ উপলভ্য না থাকলে
ActivityNotFoundException
ব্যতিক্রমকে ম্যানেজ করা।
আপনার অ্যাপের কোনও অংশ যদি
startActivity()-এ কল করা
সফল হবে কিনা তা জানার উপর নির্ভর করে, যেমন UI দেখানো, তাহলে আপনার অ্যাপের ম্যানিফেস্টের
<queries> এলিমেন্টে একটি এলিমেন্ট
যোগ করুন। সাধারণত, এটি একটি <intent> এলিমেন্ট।
URL খুলুন
এই বিভাগে Android ১১ বা তার পরবর্তী যেকোনও ভার্সনকে টার্গেট করে এমন অ্যাপে URL খোলার বিভিন্ন উপায় বর্ণনা করা হয়েছে।
ব্রাউজার বা অন্য অ্যাপে URL খুলুন
URL খুলতে, এমন ইনটেন্ট ব্যবহার করুন যাতে
ACTION_VIEW ইনটেন্ট অ্যাকশন থাকে, যেমন
ওয়েব URL লোড করা সংক্রান্ত গাইডে
বর্ণনা করা হয়েছে। এই ইনটেন্ট ব্যবহার করে startActivity()-এ কল করার পরে, নিম্নলিখিতগুলির মধ্যে যেকোনও একটি ঘটবে:
- URLটি ওয়েব ব্রাউজার অ্যাপে খোলে।
- URL-টি এমন একটি অ্যাপে খোলে যা URL-টিকে ডিপ লিঙ্ক হিসেবে সাপোর্ট করে।
- একটি দ্ব্যর্থতা নিরসন ডায়ালগ দেখানো হয়, যা ব্যবহারকারীকে URL খোলার জন্য অ্যাপ বেছে নিতে দেয়।
ActivityNotFoundExceptionহয় কারণ ডিভাইসে এমন কোনও অ্যাপ ইনস্টল করা নেই যা URL খুলতে পারে। (এটি অস্বাভাবিক।)আপনার অ্যাপ যাতে
ActivityNotFoundException-কে ক্যাচ ও ম্যানেজ করতে পারে, সেই জন্য এটি সাজেস্ট করা হয়।
যেহেতু startActivity() পদ্ধতিতে অন্য অ্যাপ্লিকেশনের অ্যাক্টিভিটি শুরু করার জন্য প্যাকেজ দৃশ্যমানতার প্রয়োজন হয় না, তাই আপনার অ্যাপের ম্যানিফেস্টে <queries> এলিমেন্ট যোগ করার বা আগে থেকে থাকা <queries> এলিমেন্টে কোনও পরিবর্তন করার প্রয়োজন নেই। URL খোলে এমন ইমপ্লিসিট ও এক্সপ্লিসিট ইনটেন্ট, দুটির ক্ষেত্রেই এটি প্রযোজ্য।
ব্রাউজার উপলভ্য আছে কিনা তা চেক করুন
কিছু ক্ষেত্রে, আপনার অ্যাপ কোনও 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 খোলার জন্য কনফিগার করে থাকেন, তাহলে
তালিকায় ব্রাউজার অ্যাপ
অন্তর্ভুক্ত থাকে না।
কাস্টম ট্যাবে URL খুলুন
কাস্টম ট্যাব কোনও অ্যাপকে
ব্রাউজারের লুক ও ফিল কাস্টমাইজ করতে দেয়। আপনার অ্যাপ ম্যানিফেস্টে <queries> এলিমেন্ট যোগ বা পরিবর্তন না করেই আপনি কাস্টম ট্যাবে
URL খুলতে পারবেন।
তবে, আপনি হয়ত ডিভাইসে এমন কোনও ব্রাউজার আছে কিনা তা চেক করতে চাইবেন যা
কাস্টম ট্যাব সাপোর্ট করে
অথবা CustomTabsClient.getPackageName() ব্যবহার করে কাস্টম ট্যাবের সাথে লঞ্চ করার জন্য
নির্দিষ্ট ব্রাউজার বেছে নিতে চাইবেন।
সেইসব ক্ষেত্রে, আপনার ম্যানিফেস্টে <queries> এলিমেন্টের অংশ হিসেবে নিম্নলিখিত <intent> এলিমেন্ট অন্তর্ভুক্ত করুন:
<!-- Place inside the <queries> element. --> <intent> <action android:name="android.support.customtabs.action.CustomTabsService" /> </intent>
ব্রাউজার নয় এমন অ্যাপকে URL ম্যানেজ করতে দিন
আপনার অ্যাপ কাস্টম ট্যাব ব্যবহার করে URL খুলতে পারলেও, সম্ভব হলে ব্রাউজার নয় এমন অ্যাপকে URL খুলতে দেওয়ার
সাজেশন দেওয়া হয়। আপনার অ্যাপে এই
সুবিধা প্রদান করতে, এমন একটি ইনটেন্ট ব্যবহার করে startActivity()-এ কল করার চেষ্টা করুন
যা
FLAG_ACTIVITY_REQUIRE_NON_BROWSER
ইনটেন্ট ফ্ল্যাগ সেট করে। সিস্টেম ActivityNotFoundException থ্রো করলে, আপনার অ্যাপ
কাস্টম ট্যাবে URL খুলতে পারবে।
কোনও ইনটেন্টে এই ফ্ল্যাগ থাকলে, startActivity()-এ কল করলে
ActivityNotFoundException থ্রো করা হয়, যদি নিম্নলিখিত যেকোনও
পরিস্থিতি ঘটে:
- কলটি সরাসরি একটি ব্রাউজার অ্যাপ চালু করত।
- কলটি ব্যবহারকারীকে একটি দ্ব্যর্থতা নিরসন ডায়ালগ দেখাবে যেখানে একমাত্র বিকল্প হল ব্রাউজার অ্যাপ।
FLAG_ACTIVITY_REQUIRE_NON_BROWSER ইনটেন্ট ফ্ল্যাগ ব্যবহার করার জন্য আপনার লজিক কীভাবে আপডেট করবেন তা নিম্নলিখিত কোড স্নিপেট থেকে জানতে পারবেন:
Kotlin
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 ফ্ল্যাগ একসাথে ব্যবহার করতে হয়:
Kotlin
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 অ্যাক্সেস করার অনুমতি দিন
মনে রাখবেন: এই বিভাগে যেমন বর্ণনা করা হয়েছে, URI অ্যাক্সেস সংক্রান্ত অনুমতি ঘোষণা করা Android 11 (API লেভেল ৩০) বা তার পরবর্তী ভার্সনকে টার্গেট করা অ্যাপের জন্য প্রয়োজনীয় এবং সব অ্যাপের জন্য সাজেস্ট করা হয়, তাদের টার্গেট SDK ভার্সন যাই হোক না কেন এবং তারা কন্টেন্ট প্রোভাইডার এক্সপোর্ট করুক বা না করুক।
Android ১১ বা তার পরবর্তী ভার্সনকে টার্গেট করে এমন অ্যাপের ক্ষেত্রে
কন্টেন্ট URI অ্যাক্সেস করতে, আপনার অ্যাপের ইনটেন্টে অবশ্যই URI অ্যাক্সেস
অনুমতি
ঘোষণা করতে হবে, এর জন্য নিম্নলিখিত ইনটেন্ট ফ্ল্যাগগুলির মধ্যে একটি বা দুটিই সেট করতে হবে:
FLAG_GRANT_READ_URI_PERMISSION
এবং
FLAG_GRANT_WRITE_URI_PERMISSION.
Android 11 ও তার পরবর্তী ভার্সনে, URI অ্যাক্সেস করার অনুমতি, ইনটেন্ট পাওয়া অ্যাপকে নিম্নলিখিত ক্ষমতা প্রদান করে:
- প্রদত্ত URI অনুমতির উপর নির্ভর করে, কন্টেন্ট URI যে ডেটা উপস্থাপন করে তা থেকে পড়ুন বা তাতে লিখুন।
- URI অথরিটির সাথে ম্যাচ করে এমন কন্টেন্ট প্রোভাইডার সহ অ্যাপে দৃশ্যমানতা পান। যে অ্যাপে কন্টেন্ট প্রোভাইডার আছে সেটি ইনটেন্ট পাঠানো অ্যাপের থেকে আলাদা হতে পারে।
নিম্নলিখিত কোড স্নিপেট দেখায় যে কীভাবে URI অনুমতি ইনটেন্ট ফ্ল্যাগ যোগ করতে হয় যাতে Android ১১ বা তার পরবর্তী ভার্সন টার্গেট করে এমন অন্য অ্যাপ কন্টেন্ট URI-তে ডেটা দেখতে পারে:
Kotlin
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-এর আগের Android ভার্সনের তুলনায় অপরিবর্তিত থাকে।
কাস্টম টেক্সট বেছে নেওয়ার অ্যাকশন দেখুন
ব্যবহারকারীরা আপনার অ্যাপে টেক্সট বেছে নিলে, টেক্সট বেছে নেওয়ার
টুলবার
বেছে নেওয়া টেক্সটে সম্ভাব্য অপারেশন দেখায়। এই টুলবার
অন্যান্য অ্যাপ থেকে কাস্টম অ্যাকশন দেখালে, আপনার ম্যানিফেস্টে <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>