অভিপ্রায় ব্যবহার করে পরিচিতি পরিবর্তন করুন

এই পাঠটি আপনাকে দেখায় কিভাবে একটি নতুন পরিচিতি সন্নিবেশ করতে বা একটি পরিচিতির ডেটা পরিবর্তন করতে একটি Intent ব্যবহার করতে হয়৷ পরিচিতি প্রদানকারীকে সরাসরি অ্যাক্সেস করার পরিবর্তে, একটি Intent পরিচিতি অ্যাপ শুরু করে, যা উপযুক্ত Activity চালায়। এই পাঠে বর্ণিত পরিবর্তন ক্রিয়াগুলির জন্য, আপনি যদি Intent বর্ধিত ডেটা পাঠান তবে এটি শুরু হওয়া Activity UI-তে প্রবেশ করা হবে।

একটি একক পরিচিতি সন্নিবেশ বা আপডেট করার জন্য একটি Intent ব্যবহার করা নিম্নলিখিত কারণে পরিচিতি প্রদানকারীকে সংশোধন করার পছন্দের উপায়:

  • এটি আপনার নিজস্ব UI এবং কোড বিকাশের সময় এবং প্রচেষ্টা বাঁচায়।
  • এটি পরিচিতি প্রদানকারীর নিয়মগুলি অনুসরণ করে না এমন পরিবর্তনগুলির কারণে সৃষ্ট ত্রুটিগুলি প্রবর্তন করা এড়িয়ে যায়৷
  • এটি আপনাকে অনুরোধ করার জন্য প্রয়োজনীয় অনুমতিগুলির সংখ্যা হ্রাস করে। আপনার অ্যাপের পরিচিতি প্রদানকারীকে লেখার জন্য অনুমতির প্রয়োজন নেই, কারণ এটি পরিচিতি অ্যাপে পরিবর্তনগুলি অর্পণ করে, যার ইতিমধ্যেই সেই অনুমতি রয়েছে৷

একটি অভিপ্রায় ব্যবহার করে একটি নতুন পরিচিতি সন্নিবেশ করান৷

যখন আপনার অ্যাপ নতুন ডেটা পায় তখন আপনি প্রায়ই ব্যবহারকারীকে একটি নতুন পরিচিতি সন্নিবেশ করার অনুমতি দিতে চান। উদাহরণস্বরূপ, একটি রেস্তোরাঁ পর্যালোচনা অ্যাপ ব্যবহারকারীদের রেস্তোরাঁটিকে একটি পরিচিতি হিসাবে যুক্ত করার অনুমতি দিতে পারে কারণ তারা এটি পর্যালোচনা করছে৷ একটি অভিপ্রায় ব্যবহার করে এটি করতে, আপনার কাছে যতটা উপলভ্য ডেটা ব্যবহার করে অভিপ্রায় তৈরি করুন এবং তারপরে যোগাযোগ অ্যাপে অভিপ্রায় পাঠান৷

পরিচিতি অ্যাপ ব্যবহার করে একটি পরিচিতি সন্নিবেশ করা হলে পরিচিতি প্রদানকারীর ContactsContract.RawContacts টেবিলে একটি নতুন কাঁচা পরিচিতি সন্নিবেশ করা হয়। প্রয়োজনে, পরিচিতি অ্যাপটি ব্যবহারকারীদের অ্যাকাউন্টের ধরন এবং অ্যাকাউন্ট ব্যবহার করার জন্য অনুরোধ করে। পরিচিতি অ্যাপটি ব্যবহারকারীদের অবহিত করে যদি কাঁচা পরিচিতি ইতিমধ্যেই বিদ্যমান থাকে। ব্যবহারকারীদের তখন সন্নিবেশ বাতিল করার বিকল্প থাকে, এই ক্ষেত্রে কোনো যোগাযোগ তৈরি হয় না। কাঁচা পরিচিতি সম্পর্কে আরও জানতে, পরিচিতি প্রদানকারী API নির্দেশিকা দেখুন।

একটি অভিপ্রায় তৈরি করুন

শুরু করতে, Intents.Insert.ACTION অ্যাকশন দিয়ে একটি নতুন Intent অবজেক্ট তৈরি করুন। MIME প্রকার RawContacts.CONTENT_TYPE এ সেট করুন। যেমন:

কোটলিন

...
// Creates a new Intent to insert a contact
val intent = Intent(ContactsContract.Intents.Insert.ACTION).apply {
    // Sets the MIME type to match the Contacts Provider
    type = ContactsContract.RawContacts.CONTENT_TYPE
}

জাভা

...
// Creates a new Intent to insert a contact
Intent intent = new Intent(ContactsContract.Intents.Insert.ACTION);
// Sets the MIME type to match the Contacts Provider
intent.setType(ContactsContract.RawContacts.CONTENT_TYPE);

যদি আপনার কাছে ইতিমধ্যেই যোগাযোগের বিশদ বিবরণ থাকে, যেমন একটি ফোন নম্বর বা ইমেল ঠিকানা, আপনি সেগুলিকে বর্ধিত ডেটা হিসাবে অভিপ্রায়ে সন্নিবেশ করতে পারেন৷ একটি মূল মানের জন্য, Intents.Insert থেকে উপযুক্ত ধ্রুবক ব্যবহার করুন। পরিচিতি অ্যাপটি তার সন্নিবেশ স্ক্রিনে ডেটা প্রদর্শন করে, ব্যবহারকারীদের আরও সম্পাদনা এবং সংযোজন করার অনুমতি দেয়।

কোটলিন

private var emailAddress: EditText? = null
private var phoneNumber: EditText? = null
...
/* Assumes EditText fields in your UI contain an email address
 * and a phone number.
 *
 */
emailAddress = findViewById(R.id.email)
phoneNumber = findViewById(R.id.phone)
...
/*
 * Inserts new data into the Intent. This data is passed to the
 * contacts app's Insert screen
 */
intent.apply {
    // Inserts an email address
    putExtra(ContactsContract.Intents.Insert.EMAIL, emailAddress?.text)
    /*
     * In this example, sets the email type to be a work email.
     * You can set other email types as necessary.
     */
    putExtra(
            ContactsContract.Intents.Insert.EMAIL_TYPE,
            ContactsContract.CommonDataKinds.Email.TYPE_WORK
    )
    // Inserts a phone number
    putExtra(ContactsContract.Intents.Insert.PHONE, phoneNumber?.text)
    /*
     * In this example, sets the phone type to be a work phone.
     * You can set other phone types as necessary.
     */
    putExtra(
            ContactsContract.Intents.Insert.PHONE_TYPE,
            ContactsContract.CommonDataKinds.Phone.TYPE_WORK
    )
}

জাভা

private EditText emailAddress = null;
private EditText phoneNumber = null;
...
/* Assumes EditText fields in your UI contain an email address
 * and a phone number.
 *
 */
emailAddress = (EditText) findViewById(R.id.email);
phoneNumber = (EditText) findViewById(R.id.phone);
...
/*
 * Inserts new data into the Intent. This data is passed to the
 * contacts app's Insert screen
 */
// Inserts an email address
intent.putExtra(ContactsContract.Intents.Insert.EMAIL, emailAddress.getText())
/*
 * In this example, sets the email type to be a work email.
 * You can set other email types as necessary.
 */
      .putExtra(ContactsContract.Intents.Insert.EMAIL_TYPE,
            ContactsContract.CommonDataKinds.Email.TYPE_WORK)
// Inserts a phone number
      .putExtra(ContactsContract.Intents.Insert.PHONE, phoneNumber.getText())
/*
 * In this example, sets the phone type to be a work phone.
 * You can set other phone types as necessary.
 */
      .putExtra(ContactsContract.Intents.Insert.PHONE_TYPE,
            ContactsContract.CommonDataKinds.Phone.TYPE_WORK);

একবার আপনি Intent তৈরি করে ফেললে, startActivity() কল করে এটি পাঠান।

কোটলিন

    /* Sends the Intent
     */
    startActivity(intent)

জাভা

    /* Sends the Intent
     */
    startActivity(intent);

এই কলটি পরিচিতি অ্যাপে একটি স্ক্রিন খোলে যা ব্যবহারকারীদের একটি নতুন পরিচিতি প্রবেশ করতে দেয়। যোগাযোগের জন্য অ্যাকাউন্টের ধরন এবং অ্যাকাউন্টের নাম স্ক্রিনের শীর্ষে তালিকাভুক্ত করা হয়েছে। একবার ব্যবহারকারীরা ডেটা প্রবেশ করে এবং সম্পন্ন ক্লিক করলে, পরিচিতি অ্যাপের পরিচিতি তালিকা প্রদর্শিত হবে। ব্যাক ক্লিক করে ব্যবহারকারীরা আপনার অ্যাপে ফিরে যান।

একটি অভিপ্রায় ব্যবহার করে একটি বিদ্যমান পরিচিতি সম্পাদনা করুন৷

একটি Intent ব্যবহার করে একটি বিদ্যমান পরিচিতি সম্পাদনা করা উপযোগী যদি ব্যবহারকারী ইতিমধ্যে আগ্রহের একটি পরিচিতি বেছে নেয়। উদাহরণস্বরূপ, একটি অ্যাপ যে পরিচিতিগুলি খুঁজে পায় যেগুলির পোস্টাল ঠিকানা আছে কিন্তু পোস্টাল কোড নেই৷

একটি অভিপ্রায় ব্যবহার করে একটি বিদ্যমান পরিচিতি সম্পাদনা করতে, একটি পরিচিতি সন্নিবেশ করার মতো একটি পদ্ধতি ব্যবহার করুন৷ বিভাগে বর্ণিত একটি অভিপ্রায় তৈরি করুন একটি অভিপ্রায় ব্যবহার করে একটি নতুন পরিচিতি সন্নিবেশ করুন , কিন্তু অভিপ্রায়ে পরিচিতির Contacts.CONTENT_LOOKUP_URI যোগ করুন৷ CONTENT_LOOKUP_URI এবং MIME প্রকারের Contacts.CONTENT_ITEM_TYPE আপনি যদি ইতিমধ্যে আপনার কাছে থাকা বিশদ বিবরণ সহ পরিচিতি সম্পাদনা করতে চান তবে আপনি সেগুলিকে উদ্দেশ্যের বর্ধিত ডেটাতে রাখতে পারেন। লক্ষ্য করুন যে কিছু নাম কলাম একটি উদ্দেশ্য ব্যবহার করে সম্পাদনা করা যাবে না; এই কলামগুলি "আপডেট" শিরোনামের অধীনে ContactsContract.Contacts শ্রেণীর জন্য API রেফারেন্সের সারাংশ বিভাগে তালিকাভুক্ত করা হয়েছে।

অবশেষে, অভিপ্রায় পাঠান। প্রতিক্রিয়া হিসাবে, পরিচিতি অ্যাপ্লিকেশন একটি সম্পাদনা স্ক্রীন প্রদর্শন করে। যখন ব্যবহারকারী সম্পাদনা শেষ করে এবং সম্পাদনাগুলি সংরক্ষণ করে, তখন পরিচিতি অ্যাপটি একটি পরিচিতি তালিকা প্রদর্শন করে। ব্যবহারকারী ফিরে ক্লিক করলে, আপনার অ্যাপটি প্রদর্শিত হবে।

অভিপ্রায় তৈরি করুন

একটি পরিচিতি সম্পাদনা করতে, ACTION_EDIT ক্রিয়াটির সাথে একটি অভিপ্রায় তৈরি করতে Intent(action) কল করুন। যোগাযোগের Contacts.CONTENT_LOOKUP_URI অভিপ্রায়ের জন্য ডেটা মান সেট করতে setDataAndType() এ কল করুন৷CONTENT_LOOKUP_URI এবং MIME প্রকারটি Contacts.CONTENT_ITEM_TYPE CONTENT_ITEM_TYPE MIME প্রকার; যেহেতু setType() এ একটি কল Intent বর্তমান ডেটা মানকে ওভাররাইট করে, আপনাকে একই সময়ে ডেটা এবং MIME প্রকার সেট করতে হবে।

একটি পরিচিতির Contacts.CONTENT_LOOKUP_URI পেতে, পরিচিতির Contacts._ID এবং Contacts.LOOKUP_KEY মানগুলি আর্গুমেন্ট হিসাবে সহ Contacts.getLookupUri(id, lookupkey) কল করুন৷

দ্রষ্টব্য: একটি পরিচিতির LOOKUP_KEY মান হল শনাক্তকারী যা আপনাকে একটি পরিচিতি পুনরুদ্ধার করতে ব্যবহার করা উচিত৷ অভ্যন্তরীণ ক্রিয়াকলাপগুলি পরিচালনা করতে প্রদানকারী পরিচিতির সারি আইডি পরিবর্তন করলেও এটি স্থির থাকে৷

নিম্নলিখিত স্নিপেট আপনাকে দেখায় কিভাবে একটি অভিপ্রায় তৈরি করতে হয়:

কোটলিন

    // The Cursor that contains the Contact row
    var mCursor: Cursor? = null
    // The index of the lookup key column in the cursor
    var lookupKeyIndex: Int = 0
    // The index of the contact's _ID value
    var idIndex: Int = 0
    // The lookup key from the Cursor
    var currentLookupKey: String? = null
    // The _ID value from the Cursor
    var currentId: Long = 0
    // A content URI pointing to the contact
    var selectedContactUri: Uri? = null
    ...
    /*
     * Once the user has selected a contact to edit,
     * this gets the contact's lookup key and _ID values from the
     * cursor and creates the necessary URI.
     */
    mCursor?.apply {
        // Gets the lookup key column index
        lookupKeyIndex = getColumnIndex(ContactsContract.Contacts.LOOKUP_KEY)
        // Gets the lookup key value
        currentLookupKey = getString(lookupKeyIndex)
        // Gets the _ID column index
        idIndex = getColumnIndex(ContactsContract.Contacts._ID)
        currentId = getLong(idIndex)
        selectedContactUri = ContactsContract.Contacts.getLookupUri(currentId, mCurrentLookupKey)
    }

    // Creates a new Intent to edit a contact
    val editIntent = Intent(Intent.ACTION_EDIT).apply {
        /*
         * Sets the contact URI to edit, and the data type that the
         * Intent must match
         */
        setDataAndType(selectedContactUri, ContactsContract.Contacts.CONTENT_ITEM_TYPE)
    }

জাভা

    // The Cursor that contains the Contact row
    public Cursor mCursor;
    // The index of the lookup key column in the cursor
    public int lookupKeyIndex;
    // The index of the contact's _ID value
    public int idIndex;
    // The lookup key from the Cursor
    public String currentLookupKey;
    // The _ID value from the Cursor
    public long currentId;
    // A content URI pointing to the contact
    Uri selectedContactUri;
    ...
    /*
     * Once the user has selected a contact to edit,
     * this gets the contact's lookup key and _ID values from the
     * cursor and creates the necessary URI.
     */
    // Gets the lookup key column index
    lookupKeyIndex = mCursor.getColumnIndex(ContactsContract.Contacts.LOOKUP_KEY);
    // Gets the lookup key value
    currentLookupKey = mCursor.getString(lookupKeyIndex);
    // Gets the _ID column index
    idIndex = mCursor.getColumnIndex(ContactsContract.Contacts._ID);
    currentId = mCursor.getLong(idIndex);
    selectedContactUri =
            Contacts.getLookupUri(currentId, mCurrentLookupKey);
    ...
    // Creates a new Intent to edit a contact
    Intent editIntent = new Intent(Intent.ACTION_EDIT);
    /*
     * Sets the contact URI to edit, and the data type that the
     * Intent must match
     */
    editIntent.setDataAndType(selectedContactUri, ContactsContract.Contacts.CONTENT_ITEM_TYPE);

নেভিগেশন পতাকা যোগ করুন

Android 4.0 (API সংস্করণ 14) এবং পরবর্তীতে, পরিচিতি অ্যাপে একটি সমস্যা ভুল নেভিগেশনের কারণ হয়। যখন আপনার অ্যাপ পরিচিতি অ্যাপে একটি সম্পাদনার অভিপ্রায় পাঠায়, এবং ব্যবহারকারীরা একটি পরিচিতি সম্পাদনা ও সংরক্ষণ করে, যখন তারা ফিরে ক্লিক করে তখন তারা পরিচিতির তালিকার স্ক্রীন দেখতে পায়। আপনার অ্যাপে ফিরে যেতে, তাদের সাম্প্রতিক ক্লিক করতে হবে এবং আপনার অ্যাপ বেছে নিতে হবে।

অ্যান্ড্রয়েড 4.0.3 (এপিআই সংস্করণ 15) এবং পরবর্তীতে এই সমস্যাটি মোকাবেলা করতে, true মান সহ অভিপ্রায়ে বর্ধিত ডেটা কী finishActivityOnSaveCompleted যোগ করুন। অ্যান্ড্রয়েড 4.0 এর আগের সংস্করণগুলি এই কীটি গ্রহণ করে, তবে এটির কোনও প্রভাব নেই। বর্ধিত ডেটা সেট করতে, নিম্নলিখিতগুলি করুন:

কোটলিন

    // Sets the special extended data for navigation
    editIntent.putExtra("finishActivityOnSaveCompleted", true)

জাভা

    // Sets the special extended data for navigation
    editIntent.putExtra("finishActivityOnSaveCompleted", true);

অন্যান্য বর্ধিত ডেটা যোগ করুন

Intent অতিরিক্ত বর্ধিত ডেটা যোগ করতে, পছন্দমতো putExtra() কল করুন। আপনি Intents.Insert এ নির্দিষ্ট কী মান ব্যবহার করে সাধারণ যোগাযোগের ক্ষেত্রের জন্য বর্ধিত ডেটা যোগ করতে পারেন। মনে রাখবেন ContactsContract.Contacts টেবিলের কিছু কলাম পরিবর্তন করা যাবে না। এই কলামগুলি "আপডেট" শিরোনামের অধীনে ContactsContract.Contacts শ্রেণীর জন্য API রেফারেন্সের সারাংশ বিভাগে তালিকাভুক্ত করা হয়েছে।

অভিপ্রায় পাঠান

অবশেষে, আপনি যে অভিপ্রায় তৈরি করেছেন তা পাঠান। যেমন:

কোটলিন

    // Sends the Intent
    startActivity(editIntent)

জাভা

    // Sends the Intent
    startActivity(editIntent);

ব্যবহারকারীদের একটি অভিপ্রায় ব্যবহার করে সন্নিবেশ বা সম্পাদনা করতে বেছে নিতে দিন

আপনি ব্যবহারকারীদের ACTION_INSERT_OR_EDIT অ্যাকশনের সাথে একটি Intent পাঠিয়ে একটি পরিচিতি সন্নিবেশ করান বা বিদ্যমান একটি সম্পাদনা করবেন কিনা তা চয়ন করার অনুমতি দিতে পারেন। উদাহরণস্বরূপ, একটি ইমেল ক্লায়েন্ট অ্যাপ্লিকেশন ব্যবহারকারীদের একটি নতুন পরিচিতিতে একটি ইনকামিং ইমেল ঠিকানা যোগ করার অনুমতি দিতে পারে, বা এটি একটি বিদ্যমান পরিচিতির জন্য একটি অতিরিক্ত ঠিকানা হিসাবে যুক্ত করতে পারে৷ এই অভিপ্রায়ের জন্য MIME প্রকারটি Contacts.CONTENT_ITEM_TYPE সেট করুন৷CONTENT_ITEM_TYPE , কিন্তু ডেটা URI সেট করবেন না৷

আপনি যখন এই উদ্দেশ্যটি পাঠান, তখন পরিচিতি অ্যাপ পরিচিতিগুলির একটি তালিকা প্রদর্শন করে৷ ব্যবহারকারীরা একটি নতুন পরিচিতি সন্নিবেশ করতে পারেন বা একটি বিদ্যমান পরিচিতি বেছে নিতে পারেন এবং এটি সম্পাদনা করতে পারেন৷ আপনি যে কোনো বর্ধিত ডেটা ক্ষেত্রগুলিকে অভিপ্রায়ে যুক্ত করেন তা প্রদর্শিত স্ক্রীনকে পপুলেট করে। আপনি Intents.Insert এ নির্দিষ্ট করা মূল মানগুলির যেকোনো একটি ব্যবহার করতে পারেন। নিম্নলিখিত কোড স্নিপেট দেখায় কিভাবে অভিপ্রায় তৈরি এবং পাঠাতে হয়:

কোটলিন

    // Creates a new Intent to insert or edit a contact
    val intentInsertEdit = Intent(Intent.ACTION_INSERT_OR_EDIT).apply {
        // Sets the MIME type
        type = ContactsContract.Contacts.CONTENT_ITEM_TYPE
    }
    // Add code here to insert extended data, if desired

    // Sends the Intent with an request ID
    startActivity(intentInsertEdit)

জাভা

    // Creates a new Intent to insert or edit a contact
    Intent intentInsertEdit = new Intent(Intent.ACTION_INSERT_OR_EDIT);
    // Sets the MIME type
    intentInsertEdit.setType(ContactsContract.Contacts.CONTENT_ITEM_TYPE);
    // Add code here to insert extended data, if desired
    ...
    // Sends the Intent with an request ID
    startActivity(intentInsertEdit);