সীমিত প্যাকেজ দৃশ্যমানতা থাকাকালীন সাধারণ ব্যবহারের ক্ষেত্রে পূরণ করুন

এই ডকুমেন্টটি বেশ কয়েকটি সাধারণ ব্যবহারের উদাহরণ উপস্থাপন করে যেখানে একটি অ্যাপ অন্যান্য অ্যাপের সাথে ইন্টারঅ্যাক্ট করে। প্রতিটি বিভাগ সীমিত প্যাকেজ দৃশ্যমানতার সাথে অ্যাপের কার্যকারিতা কীভাবে সম্পন্ন করতে হয় সে সম্পর্কে নির্দেশিকা প্রদান করে, যা আপনার অ্যাপটি Android 11 (API লেভেল 30) বা তার উচ্চতর সংস্করণের জন্য উপযুক্ত হলে বিবেচনা করা উচিত।

যখন Android 11 বা তার উচ্চতর ভার্সনকে লক্ষ্য করে এমন একটি অ্যাপ অন্য অ্যাপে একটি কার্যকলাপ শুরু করার জন্য একটি উদ্দেশ্য ব্যবহার করে, তখন সবচেয়ে সহজ পদ্ধতি হল অভিপ্রায়টি ব্যবহার করা এবং যদি কোনও অ্যাপ উপলব্ধ না থাকে তবে ActivityNotFoundException ব্যতিক্রমটি পরিচালনা করা।

যদি আপনার অ্যাপের কিছু অংশ startActivity() এর কল সফল হতে পারে কিনা তা জানার উপর নির্ভর করে, যেমন একটি UI দেখানো, তাহলে আপনার অ্যাপের ম্যানিফেস্টের <queries> এলিমেন্টে একটি এলিমেন্ট যোগ করুন। সাধারণত, এটি একটি <intent> এলিমেন্ট।

URL গুলি খুলুন

এই বিভাগে Android 11 বা তার উচ্চতর ভার্সনের জন্য তৈরি অ্যাপে 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 খুলতে দেওয়া বাঞ্ছনীয়। আপনার অ্যাপে এই ক্ষমতা প্রদানের জন্য, 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 অ্যাক্সেস দিন

দ্রষ্টব্য: এই বিভাগে বর্ণিত URI অ্যাক্সেস অনুমতি ঘোষণা করা Android 11 (API লেভেল 30) বা তার বেশি ভার্সনের অ্যাপগুলির জন্য প্রয়োজনীয় এবং সমস্ত অ্যাপের জন্য সুপারিশ করা হয়, তাদের টার্গেট SDK ভার্সন নির্বিশেষে এবং তারা তাদের কন্টেন্ট প্রদানকারী রপ্তানি করে কিনা তা নির্বিশেষে।

যেসব অ্যাপ Android 11 বা তার পরবর্তী ভার্সনের জন্য কন্টেন্ট URI অ্যাক্সেস করতে চায়, তাদের জন্য আপনার অ্যাপের ইন্টেন্টকে নিম্নলিখিত ইন্টেন্ট ফ্ল্যাগগুলির একটি বা উভয় সেট করে URI অ্যাক্সেস অনুমতি ঘোষণা করতে হবে: FLAG_GRANT_READ_URI_PERMISSION এবং FLAG_GRANT_WRITE_URI_PERMISSION

অ্যান্ড্রয়েড ১১ এবং তার পরবর্তী ভার্সনে, URI অ্যাক্সেসের অনুমতিগুলি অ্যাপ্লিকেশনটিকে নিম্নলিখিত ক্ষমতা প্রদান করে যা উদ্দেশ্য গ্রহণ করে:

  • প্রদত্ত URI অনুমতির উপর নির্ভর করে, কন্টেন্ট 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> উপাদানের অংশ হিসেবে ইন্টেন্ট ফিল্টার স্বাক্ষর ব্যবহার করে সেই কাস্টম আচরণ উপস্থাপন করতে পারেন। নিম্নলিখিত বিভাগগুলি বেশ কয়েকটি সাধারণ পরিস্থিতির জন্য বিস্তারিত নির্দেশিকা প্রদান করে।

এসএমএস অ্যাপের জন্য কোয়েরি

যদি আপনার অ্যাপের ডিভাইসে ইনস্টল করা SMS অ্যাপের সেট সম্পর্কে তথ্যের প্রয়োজন হয়, উদাহরণস্বরূপ, কোন অ্যাপটি ডিভাইসের ডিফল্ট SMS হ্যান্ডলার তা পরীক্ষা করার জন্য, তাহলে আপনার ম্যানিফেস্টে <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>

একটি পরিচিতির জন্য কাস্টম ডেটা সারি দেখান

অ্যাপগুলি পরিচিতি সরবরাহকারীতে কাস্টম ডেটা সারি যোগ করতে পারে। একটি পরিচিতি অ্যাপকে এই কাস্টম ডেটা দেখানোর জন্য, এটিকে নিম্নলিখিতগুলি করতে সক্ষম হতে হবে:

  1. অন্যান্য অ্যাপ থেকে contacts.xml ফাইলটি পড়ুন।
  2. কাস্টম MIME টাইপের সাথে সম্পর্কিত একটি আইকন লোড করুন।

যদি আপনার অ্যাপটি একটি contacts অ্যাপ হয়, তাহলে আপনার ম্যানিফেস্টে <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>