টিভি অ্যাপ্লিকেশানগুলি অনুসন্ধানযোগ্য করুন৷

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

আপনার অ্যাপটিকে অবশ্যই Android TV প্রদান করতে হবে ডেটা ক্ষেত্রগুলি যেখান থেকে Android TV প্রস্তাবিত অনুসন্ধান ফলাফল তৈরি করতে পারে যখন ব্যবহারকারী অনুসন্ধান ডায়ালগে অক্ষরগুলি প্রবেশ করে। এটি করার জন্য, আপনার অ্যাপটিকে অবশ্যই একটি বিষয়বস্তু প্রদানকারীকে প্রয়োগ করতে হবে যা একটি searchable.xml কনফিগারেশন ফাইলের সাথে পরামর্শ প্রদান করে যা Android TV-এর জন্য সামগ্রী প্রদানকারী এবং অন্যান্য গুরুত্বপূর্ণ তথ্য বর্ণনা করে৷ আপনার এমন একটি ক্রিয়াকলাপও দরকার যা ব্যবহারকারী যখন একটি প্রস্তাবিত অনুসন্ধান ফলাফল নির্বাচন করে তখন ফায়ার করার অভিপ্রায়টি পরিচালনা করে। আরো বিস্তারিত জানার জন্য, কাস্টম অনুসন্ধানের পরামর্শ যোগ করুন দেখুন। এই নির্দেশিকাটি Android TV অ্যাপগুলির জন্য নির্দিষ্ট মূল বিষয়গুলি কভার করে৷

এই নির্দেশিকাটি পড়ার আগে, নিশ্চিত করুন যে আপনি অনুসন্ধান API গাইডে ব্যাখ্যা করা ধারণাগুলির সাথে পরিচিত৷ এছাড়াও, অনুসন্ধান কার্যকারিতা যুক্ত করুন পর্যালোচনা করুন।

এই গাইডের নমুনা কোডটি Leanback স্যাম্পল অ্যাপ থেকে এসেছে।

কলাম সনাক্ত করুন

SearchManager একটি স্থানীয় ডাটাবেসের কলাম হিসাবে প্রতিনিধিত্ব করে এটি প্রত্যাশা করে এমন ডেটা ক্ষেত্রগুলি বর্ণনা করে। আপনার ডেটার বিন্যাস নির্বিশেষে, আপনাকে অবশ্যই আপনার ডেটা ক্ষেত্রগুলিকে এই কলামগুলিতে ম্যাপ করতে হবে, সাধারণত আপনার সামগ্রী ডেটা অ্যাক্সেস করে এমন ক্লাসে৷ প্রয়োজনীয় ক্ষেত্রগুলিতে আপনার বিদ্যমান ডেটা ম্যাপ করে এমন একটি ক্লাস তৈরির বিষয়ে তথ্যের জন্য, একটি সাজেশন টেবিল তৈরি করা দেখুন।

SearchManager ক্লাসে Android TV-এর জন্য বেশ কিছু কলাম রয়েছে। নিম্নলিখিত সারণীতে আরও কিছু গুরুত্বপূর্ণ কলাম বর্ণনা করা হয়েছে।

মান বর্ণনা
SUGGEST_COLUMN_TEXT_1 আপনার সামগ্রীর নাম (প্রয়োজনীয়)
SUGGEST_COLUMN_TEXT_2 আপনার বিষয়বস্তুর একটি পাঠ্য বিবরণ
SUGGEST_COLUMN_RESULT_CARD_IMAGE আপনার সামগ্রীর জন্য একটি ছবি, পোস্টার বা কভার৷
SUGGEST_COLUMN_CONTENT_TYPE আপনার মিডিয়ার MIME প্রকার
SUGGEST_COLUMN_VIDEO_WIDTH আপনার মিডিয়ার রেজোলিউশন প্রস্থ
SUGGEST_COLUMN_VIDEO_HEIGHT আপনার মিডিয়ার রেজোলিউশনের উচ্চতা
SUGGEST_COLUMN_PRODUCTION_YEAR আপনার সামগ্রীর উৎপাদন বছর (প্রয়োজনীয়)
SUGGEST_COLUMN_DURATION আপনার মিডিয়ার মিলিসেকেন্ডে সময়কাল (প্রয়োজনীয়)

অনুসন্ধান কাঠামোর জন্য নিম্নলিখিত কলামগুলির প্রয়োজন:

যখন আপনার সামগ্রীর জন্য এই কলামগুলির মানগুলি Google সার্ভারগুলির দ্বারা পাওয়া অন্যান্য সরবরাহকারীদের থেকে পাওয়া একই সামগ্রীর মানগুলির সাথে মেলে, তখন সিস্টেমটি অন্যান্য প্রদানকারীদের অ্যাপগুলির লিঙ্কগুলির সাথে সামগ্রীর বিশদ দৃশ্যে আপনার অ্যাপের একটি গভীর লিঙ্ক প্রদান করে . বিস্তারিত স্ক্রীন বিভাগে আপনার অ্যাপের ডিপ লিঙ্কে এটি আরও আলোচনা করা হয়েছে।

আপনার অ্যাপ্লিকেশনের ডাটাবেস শ্রেণী কলামগুলিকে নিম্নরূপ সংজ্ঞায়িত করতে পারে:

কোটলিন

class VideoDatabase {
    companion object {
        // The columns we'll include in the video database table
        val KEY_NAME = SearchManager.SUGGEST_COLUMN_TEXT_1
        val KEY_DESCRIPTION = SearchManager.SUGGEST_COLUMN_TEXT_2
        val KEY_ICON = SearchManager.SUGGEST_COLUMN_RESULT_CARD_IMAGE
        val KEY_DATA_TYPE = SearchManager.SUGGEST_COLUMN_CONTENT_TYPE
        val KEY_IS_LIVE = SearchManager.SUGGEST_COLUMN_IS_LIVE
        val KEY_VIDEO_WIDTH = SearchManager.SUGGEST_COLUMN_VIDEO_WIDTH
        val KEY_VIDEO_HEIGHT = SearchManager.SUGGEST_COLUMN_VIDEO_HEIGHT
        val KEY_AUDIO_CHANNEL_CONFIG = SearchManager.SUGGEST_COLUMN_AUDIO_CHANNEL_CONFIG
        val KEY_PURCHASE_PRICE = SearchManager.SUGGEST_COLUMN_PURCHASE_PRICE
        val KEY_RENTAL_PRICE = SearchManager.SUGGEST_COLUMN_RENTAL_PRICE
        val KEY_RATING_STYLE = SearchManager.SUGGEST_COLUMN_RATING_STYLE
        val KEY_RATING_SCORE = SearchManager.SUGGEST_COLUMN_RATING_SCORE
        val KEY_PRODUCTION_YEAR = SearchManager.SUGGEST_COLUMN_PRODUCTION_YEAR
        val KEY_COLUMN_DURATION = SearchManager.SUGGEST_COLUMN_DURATION
        val KEY_ACTION = SearchManager.SUGGEST_COLUMN_INTENT_ACTION
        ...
    }
    ...
}

জাভা

public class VideoDatabase {
    // The columns we'll include in the video database table
    public static final String KEY_NAME = SearchManager.SUGGEST_COLUMN_TEXT_1;
    public static final String KEY_DESCRIPTION = SearchManager.SUGGEST_COLUMN_TEXT_2;
    public static final String KEY_ICON = SearchManager.SUGGEST_COLUMN_RESULT_CARD_IMAGE;
    public static final String KEY_DATA_TYPE = SearchManager.SUGGEST_COLUMN_CONTENT_TYPE;
    public static final String KEY_IS_LIVE = SearchManager.SUGGEST_COLUMN_IS_LIVE;
    public static final String KEY_VIDEO_WIDTH = SearchManager.SUGGEST_COLUMN_VIDEO_WIDTH;
    public static final String KEY_VIDEO_HEIGHT = SearchManager.SUGGEST_COLUMN_VIDEO_HEIGHT;
    public static final String KEY_AUDIO_CHANNEL_CONFIG =
            SearchManager.SUGGEST_COLUMN_AUDIO_CHANNEL_CONFIG;
    public static final String KEY_PURCHASE_PRICE = SearchManager.SUGGEST_COLUMN_PURCHASE_PRICE;
    public static final String KEY_RENTAL_PRICE = SearchManager.SUGGEST_COLUMN_RENTAL_PRICE;
    public static final String KEY_RATING_STYLE = SearchManager.SUGGEST_COLUMN_RATING_STYLE;
    public static final String KEY_RATING_SCORE = SearchManager.SUGGEST_COLUMN_RATING_SCORE;
    public static final String KEY_PRODUCTION_YEAR = SearchManager.SUGGEST_COLUMN_PRODUCTION_YEAR;
    public static final String KEY_COLUMN_DURATION = SearchManager.SUGGEST_COLUMN_DURATION;
    public static final String KEY_ACTION = SearchManager.SUGGEST_COLUMN_INTENT_ACTION;
...

আপনি যখন SearchManager কলাম থেকে আপনার ডেটা ফিল্ডে মানচিত্র তৈরি করেন, তখন আপনাকে অবশ্যই _ID উল্লেখ করতে হবে প্রতিটি সারিকে একটি অনন্য ID দিতে।

কোটলিন


companion object {
    ....
    private fun buildColumnMap(): Map<String, String> {
        return mapOf(
          KEY_NAME to KEY_NAME,
          KEY_DESCRIPTION to KEY_DESCRIPTION,
          KEY_ICON to KEY_ICON,
          KEY_DATA_TYPE to KEY_DATA_TYPE,
          KEY_IS_LIVE to KEY_IS_LIVE,
          KEY_VIDEO_WIDTH to KEY_VIDEO_WIDTH,
          KEY_VIDEO_HEIGHT to KEY_VIDEO_HEIGHT,
          KEY_AUDIO_CHANNEL_CONFIG to KEY_AUDIO_CHANNEL_CONFIG,
          KEY_PURCHASE_PRICE to KEY_PURCHASE_PRICE,
          KEY_RENTAL_PRICE to KEY_RENTAL_PRICE,
          KEY_RATING_STYLE to KEY_RATING_STYLE,
          KEY_RATING_SCORE to KEY_RATING_SCORE,
          KEY_PRODUCTION_YEAR to KEY_PRODUCTION_YEAR,
          KEY_COLUMN_DURATION to KEY_COLUMN_DURATION,
          KEY_ACTION to KEY_ACTION,
          BaseColumns._ID to ("rowid AS " + BaseColumns._ID),
          SearchManager.SUGGEST_COLUMN_INTENT_DATA_ID to ("rowid AS " + SearchManager.SUGGEST_COLUMN_INTENT_DATA_ID),
          SearchManager.SUGGEST_COLUMN_SHORTCUT_ID to ("rowid AS " + SearchManager.SUGGEST_COLUMN_SHORTCUT_ID)
        )
    }
}

জাভা

...
  private static HashMap<String, String> buildColumnMap() {
    HashMap<String, String> map = new HashMap<String, String>();
    map.put(KEY_NAME, KEY_NAME);
    map.put(KEY_DESCRIPTION, KEY_DESCRIPTION);
    map.put(KEY_ICON, KEY_ICON);
    map.put(KEY_DATA_TYPE, KEY_DATA_TYPE);
    map.put(KEY_IS_LIVE, KEY_IS_LIVE);
    map.put(KEY_VIDEO_WIDTH, KEY_VIDEO_WIDTH);
    map.put(KEY_VIDEO_HEIGHT, KEY_VIDEO_HEIGHT);
    map.put(KEY_AUDIO_CHANNEL_CONFIG, KEY_AUDIO_CHANNEL_CONFIG);
    map.put(KEY_PURCHASE_PRICE, KEY_PURCHASE_PRICE);
    map.put(KEY_RENTAL_PRICE, KEY_RENTAL_PRICE);
    map.put(KEY_RATING_STYLE, KEY_RATING_STYLE);
    map.put(KEY_RATING_SCORE, KEY_RATING_SCORE);
    map.put(KEY_PRODUCTION_YEAR, KEY_PRODUCTION_YEAR);
    map.put(KEY_COLUMN_DURATION, KEY_COLUMN_DURATION);
    map.put(KEY_ACTION, KEY_ACTION);
    map.put(BaseColumns._ID, "rowid AS " +
            BaseColumns._ID);
    map.put(SearchManager.SUGGEST_COLUMN_INTENT_DATA_ID, "rowid AS " +
            SearchManager.SUGGEST_COLUMN_INTENT_DATA_ID);
    map.put(SearchManager.SUGGEST_COLUMN_SHORTCUT_ID, "rowid AS " +
            SearchManager.SUGGEST_COLUMN_SHORTCUT_ID);
    return map;
  }
...

আগের উদাহরণে, SUGGEST_COLUMN_INTENT_DATA_ID ক্ষেত্রের ম্যাপিংটি লক্ষ্য করুন৷ এটি URI-এর সেই অংশ যা এই সারির ডেটার জন্য অনন্য বিষয়বস্তুর দিকে নির্দেশ করে—ইউআরআই-এর শেষ অংশ, যেখানে বিষয়বস্তু সংরক্ষণ করা হয়েছে তা বর্ণনা করে। URI-এর প্রথম অংশ, যখন এটি টেবিলের সমস্ত সারিতে সাধারণ হয়, তখন searchable.xml ফাইলে android:searchSuggestIntentData অ্যাট্রিবিউট হিসেবে সেট করা হয়, যেমন হ্যান্ডেল সার্চ সাজেশন বিভাগে বর্ণনা করা হয়েছে।

যদি URI-এর প্রথম অংশটি টেবিলের প্রতিটি সারির জন্য আলাদা হয়, তাহলে SUGGEST_COLUMN_INTENT_DATA ফিল্ড দিয়ে সেই মানটি ম্যাপ করুন। ব্যবহারকারী যখন এই বিষয়বস্তুটি নির্বাচন করে, তখন যে উদ্দেশ্যটি ফায়ার হয় সেটি SUGGEST_COLUMN_INTENT_DATA_ID এবং হয় android:searchSuggestIntentData বৈশিষ্ট্য বা SUGGEST_COLUMN_INTENT_DATA ফিল্ড মানগুলির সংমিশ্রণ থেকে অভিপ্রায় ডেটা প্রদান করে৷

অনুসন্ধান পরামর্শ তথ্য প্রদান

Android TV সার্চ ডায়ালগে সার্চ টার্ম সাজেশন ফেরত দিতে একটি বিষয়বস্তু প্রদানকারীকে প্রয়োগ করুন। সিস্টেম প্রতিবার একটি চিঠি টাইপ করার সময় query() পদ্ধতিতে কল করে পরামর্শের জন্য আপনার সামগ্রী প্রদানকারীকে জিজ্ঞাসা করে। আপনার query() বাস্তবায়নে, আপনার বিষয়বস্তু প্রদানকারী আপনার পরামর্শের ডেটা অনুসন্ধান করে এবং একটি Cursor ফেরত দেয় যা আপনি পরামর্শের জন্য মনোনীত সারিগুলিকে নির্দেশ করে৷

কোটলিন

fun query(uri: Uri, projection: Array<String>, selection: String, selectionArgs: Array<String>,
        sortOrder: String): Cursor {
    // Use the UriMatcher to see what kind of query we have and format the db query accordingly
    when (URI_MATCHER.match(uri)) {
        SEARCH_SUGGEST -> {
            Log.d(TAG, "search suggest: ${selectionArgs[0]} URI: $uri")
            if (selectionArgs == null) {
                throw IllegalArgumentException(
                        "selectionArgs must be provided for the Uri: $uri")
            }
            return getSuggestions(selectionArgs[0])
        }
        else -> throw IllegalArgumentException("Unknown Uri: $uri")
    }
}

private fun getSuggestions(query: String): Cursor {
    val columns = arrayOf<String>(
            BaseColumns._ID,
            VideoDatabase.KEY_NAME,
            VideoDatabase.KEY_DESCRIPTION,
            VideoDatabase.KEY_ICON,
            VideoDatabase.KEY_DATA_TYPE,
            VideoDatabase.KEY_IS_LIVE,
            VideoDatabase.KEY_VIDEO_WIDTH,
            VideoDatabase.KEY_VIDEO_HEIGHT,
            VideoDatabase.KEY_AUDIO_CHANNEL_CONFIG,
            VideoDatabase.KEY_PURCHASE_PRICE,
            VideoDatabase.KEY_RENTAL_PRICE,
            VideoDatabase.KEY_RATING_STYLE,
            VideoDatabase.KEY_RATING_SCORE,
            VideoDatabase.KEY_PRODUCTION_YEAR,
            VideoDatabase.KEY_COLUMN_DURATION,
            VideoDatabase.KEY_ACTION,
            SearchManager.SUGGEST_COLUMN_INTENT_DATA_ID
    )
    return videoDatabase.getWordMatch(query.toLowerCase(), columns)
}

জাভা

@Override
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs,
        String sortOrder) {
    // Use the UriMatcher to see what kind of query we have and format the db query accordingly
    switch (URI_MATCHER.match(uri)) {
        case SEARCH_SUGGEST:
            Log.d(TAG, "search suggest: " + selectionArgs[0] + " URI: " + uri);
            if (selectionArgs == null) {
                throw new IllegalArgumentException(
                        "selectionArgs must be provided for the Uri: " + uri);
            }
            return getSuggestions(selectionArgs[0]);
        default:
            throw new IllegalArgumentException("Unknown Uri: " + uri);
    }
}

private Cursor getSuggestions(String query) {
    query = query.toLowerCase();
    String[] columns = new String[]{
        BaseColumns._ID,
        VideoDatabase.KEY_NAME,
        VideoDatabase.KEY_DESCRIPTION,
        VideoDatabase.KEY_ICON,
        VideoDatabase.KEY_DATA_TYPE,
        VideoDatabase.KEY_IS_LIVE,
        VideoDatabase.KEY_VIDEO_WIDTH,
        VideoDatabase.KEY_VIDEO_HEIGHT,
        VideoDatabase.KEY_AUDIO_CHANNEL_CONFIG,
        VideoDatabase.KEY_PURCHASE_PRICE,
        VideoDatabase.KEY_RENTAL_PRICE,
        VideoDatabase.KEY_RATING_STYLE,
        VideoDatabase.KEY_RATING_SCORE,
        VideoDatabase.KEY_PRODUCTION_YEAR,
        VideoDatabase.KEY_COLUMN_DURATION,
        VideoDatabase.KEY_ACTION,
        SearchManager.SUGGEST_COLUMN_INTENT_DATA_ID
    };
    return videoDatabase.getWordMatch(query, columns);
}
...

আপনার ম্যানিফেস্ট ফাইলে, বিষয়বস্তু প্রদানকারী বিশেষ আচরণ পায়। একটি কার্যকলাপ হিসাবে ট্যাগ হওয়ার পরিবর্তে, এটি একটি <provider> হিসাবে বর্ণনা করা হয়েছে। আপনার সামগ্রী প্রদানকারীর নামস্থান সিস্টেমকে জানাতে প্রদানকারীর মধ্যে android:authorities অ্যাট্রিবিউট রয়েছে। এছাড়াও, আপনাকে অবশ্যই এর android:exported অ্যাট্রিবিউটকে "true" -তে সেট করতে হবে যাতে Android গ্লোবাল সার্চ এটি থেকে প্রত্যাবর্তিত ফলাফলগুলি ব্যবহার করতে পারে৷

<provider android:name="com.example.android.tvleanback.VideoContentProvider"
    android:authorities="com.example.android.tvleanback"
    android:exported="true" />

অনুসন্ধান পরামর্শ পরিচালনা করুন

অনুসন্ধানের পরামর্শ সেটিংস কনফিগার করতে আপনার অ্যাপে অবশ্যই একটি res/xml/searchable.xml ফাইল অন্তর্ভুক্ত করতে হবে।

res/xml/searchable.xml ফাইলে, android:searchSuggestAuthority অ্যাট্রিবিউটটি অন্তর্ভুক্ত করুন যাতে সিস্টেমকে আপনার বিষয়বস্তু প্রদানকারীর নামস্থান বলা যায়। এটি আপনার AndroidManifest.xml ফাইলের <provider> উপাদানের android:authorities অ্যাট্রিবিউটে আপনার নির্দিষ্ট করা স্ট্রিং মানটির সাথে মেলে।

এছাড়াও একটি লেবেল অন্তর্ভুক্ত করুন, যা অ্যাপ্লিকেশনটির নাম। অনুসন্ধানযোগ্য অ্যাপগুলি গণনা করার সময় সিস্টেম অনুসন্ধান সেটিংস এই লেবেলটি ব্যবহার করে৷

searchable.xml ফাইলে অবশ্যই android:searchSuggestIntentAction "android.intent.action.VIEW" মান সহ অন্তর্ভুক্ত করতে হবে যাতে একটি কাস্টম পরামর্শ প্রদানের জন্য অভিপ্রায় ক্রিয়া নির্ধারণ করা যায়৷ এটি একটি অনুসন্ধান শব্দ প্রদানের অভিপ্রায় ক্রিয়া থেকে আলাদা, যেমনটি নিম্নলিখিত বিভাগে বর্ণিত হয়েছে৷ পরামর্শের জন্য অভিপ্রায় ক্রিয়া ঘোষণা করার অন্যান্য উপায়ের জন্য, অভিপ্রায় ক্রিয়া ঘোষণা দেখুন।

অভিপ্রায় কর্মের পাশাপাশি, আপনার অ্যাপটিকে অবশ্যই অভিপ্রায় ডেটা প্রদান করতে হবে, যা আপনি android:searchSuggestIntentData বৈশিষ্ট্যের সাথে নির্দিষ্ট করেছেন৷ এটি URI-এর প্রথম অংশ যা বিষয়বস্তুর দিকে নির্দেশ করে, যা সেই বিষয়বস্তুর জন্য ম্যাপিং টেবিলের সমস্ত সারিতে URI-এর সাধারণ অংশ বর্ণনা করে। URI-এর যে অংশটি প্রতিটি সারির জন্য অনন্য তা SUGGEST_COLUMN_INTENT_DATA_ID ক্ষেত্র দ্বারা প্রতিষ্ঠিত হয়, যেমনটি কলাম সনাক্তকরণ বিভাগে বর্ণিত হয়েছে। পরামর্শের জন্য অভিপ্রায় ডেটা ঘোষণা করার অন্যান্য উপায়ের জন্য, অভিপ্রায় ডেটা ঘোষণা করা দেখুন।

android:searchSuggestSelection=" ?" attribute query() পদ্ধতির selection পরামিতি হিসাবে পাস করা মান নির্দিষ্ট করে। প্রশ্ন চিহ্ন ( ? ) মানটি ক্যোয়ারী টেক্সট দিয়ে প্রতিস্থাপিত হয়।

অবশেষে, আপনাকে অবশ্যই android:includeInGlobalSearch বৈশিষ্ট্যটি "true" মান সহ অন্তর্ভুক্ত করতে হবে। এখানে একটি উদাহরণ searchable.xml ফাইল আছে:

<searchable xmlns:android="http://schemas.android.com/apk/res/android"
    android:label="@string/search_label"
    android:hint="@string/search_hint"
    android:searchSettingsDescription="@string/settings_description"
    android:searchSuggestAuthority="com.example.android.tvleanback"
    android:searchSuggestIntentAction="android.intent.action.VIEW"
    android:searchSuggestIntentData="content://com.example.android.tvleanback/video_database_leanback"
    android:searchSuggestSelection=" ?"
    android:searchSuggestThreshold="1"
    android:includeInGlobalSearch="true">
</searchable>

অনুসন্ধান পদ পরিচালনা করুন

যত তাড়াতাড়ি অনুসন্ধান ডায়ালগে একটি শব্দ আছে যা আপনার অ্যাপের কলামগুলির একটির সাথে মেলে, যেমন কলাম সনাক্ত করুন বিভাগে বর্ণিত হয়েছে, সিস্টেমটি ACTION_SEARCH অভিপ্রায়কে ফায়ার করে৷ আপনার অ্যাপ্লিকেশানের কার্যকলাপ যা সেই অভিপ্রায়গুলি পরিচালনা করে কলামগুলির জন্য তাদের মানগুলিতে প্রদত্ত শব্দ সহ সংগ্রহস্থল অনুসন্ধান করে এবং সেই কলামগুলির সাথে সামগ্রীর আইটেমগুলির একটি তালিকা প্রদান করে৷ আপনার AndroidManifest.xml ফাইলে, আপনি নিম্নলিখিত উদাহরণে দেখানো হিসাবে ACTION_SEARCH অভিপ্রায় পরিচালনা করে এমন কার্যকলাপকে মনোনীত করেন:

...
  <activity
      android:name="com.example.android.tvleanback.DetailsActivity"
      android:exported="true">

      <!-- Receives the search request. -->
      <intent-filter>
          <action android:name="android.intent.action.SEARCH" />
          <!-- No category needed, because the Intent will specify this class component -->
      </intent-filter>

      <!-- Points to searchable meta data. -->
      <meta-data android:name="android.app.searchable"
          android:resource="@xml/searchable" />
  </activity>
...
  <!-- Provides search suggestions for keywords against video meta data. -->
  <provider android:name="com.example.android.tvleanback.VideoContentProvider"
      android:authorities="com.example.android.tvleanback"
      android:exported="true" />
...

কার্যকলাপ অবশ্যই searchable.xml ফাইলের রেফারেন্স সহ অনুসন্ধানযোগ্য কনফিগারেশন বর্ণনা করতে হবে। গ্লোবাল সার্চ ডায়ালগ ব্যবহার করতে, ম্যানিফেস্টকে অবশ্যই বর্ণনা করতে হবে যে কোন কার্যকলাপটি অনুসন্ধানের প্রশ্নগুলি গ্রহণ করবে৷ ম্যানিফেস্টকে অবশ্যই <provider> উপাদানটি বর্ণনা করতে হবে, ঠিক যেমনটি searchable.xml ফাইলে বর্ণনা করা হয়েছে।

বিস্তারিত স্ক্রিনে আপনার অ্যাপের গভীর লিঙ্ক

আপনি যদি অনুসন্ধানের পরামর্শ বিভাগে বর্ণিত অনুসন্ধান কনফিগারেশন সেট আপ করে থাকেন এবং SUGGEST_COLUMN_TEXT_1 , SUGGEST_COLUMN_PRODUCTION_YEAR , এবং SUGGEST_COLUMN_DURATION ক্ষেত্রগুলিকে ম্যাপ করে থাকেন, যেমনটি কলাম সনাক্তকরণ বিভাগে বর্ণিত হয়েছে, তাহলে আপনার স্ক্রীন ঘড়ির বিশদ বিবরণের জন্য একটি গভীর লিঙ্ক প্রদর্শিত হবে ব্যবহারকারী যখন একটি অনুসন্ধান ফলাফল নির্বাচন করে তখন চালু হয়:

বিস্তারিত স্ক্রিনে গভীর লিঙ্ক

যখন ব্যবহারকারী আপনার অ্যাপের জন্য লিঙ্কটি নির্বাচন করেন, বিশদ স্ক্রীনে **উপলব্ধ চালু** বোতাম দ্বারা চিহ্নিত করা হয়, তখন সিস্টেমটি এমন কার্যকলাপ চালু করে যা ACTION_VIEW সেটটিকে android:searchSuggestIntentAction হিসাবে "android.intent.action.VIEW" মান সহ পরিচালনা করে "android.intent.action.VIEW" searchable.xml ফাইলে।

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

অনুসন্ধান আচরণ

হোম স্ক্রীন থেকে এবং আপনার অ্যাপের ভিতর থেকে Android TV-তে অনুসন্ধান পাওয়া যায়। এই দুটি ক্ষেত্রে অনুসন্ধানের ফলাফল ভিন্ন।

হোম স্ক্রীন থেকে অনুসন্ধান করুন

যখন ব্যবহারকারী হোম স্ক্রীন থেকে অনুসন্ধান করে, প্রথম ফলাফলটি একটি সত্তা কার্ডে উপস্থিত হয়। যদি এমন অ্যাপ থাকে যা বিষয়বস্তু চালাতে পারে, তাহলে প্রতিটির একটি লিঙ্ক কার্ডের নীচে প্রদর্শিত হবে:

টিভি অনুসন্ধান ফলাফল প্লেব্যাক

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

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

টিভি অনুসন্ধান ফলাফল

আপনার অ্যাপ থেকে অনুসন্ধান করুন

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

টিভি ইন-অ্যাপ অনুসন্ধান ফলাফল

আরও জানুন

একটি টিভি অ্যাপ অনুসন্ধান সম্পর্কে আরও জানতে, আপনার অ্যাপে ইন্টিগ্রেট অ্যান্ড্রয়েড সার্চ বৈশিষ্ট্যগুলি পড়ুন এবং অনুসন্ধান কার্যকারিতা যুক্ত করুন

একটি SearchFragment দিয়ে অ্যাপ-মধ্যস্থ অনুসন্ধানের অভিজ্ঞতা কীভাবে কাস্টমাইজ করা যায় সে সম্পর্কে আরও তথ্যের জন্য, TV অ্যাপের মধ্যে অনুসন্ধান পড়ুন।