現在、アプリケーションに Google のアプリ インデックス API と音声検索機能を実装していますが、特定のデバイスで Google がアプリケーションを検索しないという問題が発生しています。私がテストしたほとんどのデバイスは、アプリケーションで検索されたコンテンツに対してオートコンプリートを使用したローカル検索がポップアップするコード ラボの例に従って、期待どおりに動作します。私のアプリケーションは、正常に動作すると、Google 電話検索設定で検索するアプリに表示されます。
ただし、何らかの理由で、私がテストした特定のデバイス (具体的には 4.3 を実行する Galaxy S3 と 4.4.2 を実行する Galaxy Note 3) では、アプリケーションが Google 電話検索の設定に表示されません。これは、インデックス API 呼び出しが成功したことを App Indexing API が通知しているにもかかわらず、オートコンプリートの結果が表示されないことを意味します。アプリが電話検索設定にない場合、アプリケーションへの Google 音声検索も失敗しますが、通常は「検索 <-MyApplication-> for <-Content->」と言ったときに機能します。
アプリケーションで設定したディープ リンクは、オートコンプリートや音声検索の機能に関係なく機能しているようです。この問題は、アプリケーション内で修正できるものでさえないかもしれないと私は信じています。
ここに私のマニフェストを見てください:
<activity android:name=".StartActivity"
android:theme="@android:style/Theme.NoDisplay"
android:noHistory="true">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
<!--Google Voice Search-->
<intent-filter>
<action android:name="com.google.android.gms.actions.SEARCH_ACTION"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
<!--Deep link-->
<intent-filter>
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="android.intent.category.BROWSABLE"/>
<data android:scheme="MyApp"/>
<action android:name="android.intent.action.VIEW"/>
</intent-filter>
</activity>
そして、アクティビティの 1 つでアプリのインデックス作成 API を呼び出す方法は次のとおりです。
private void fireNewApplicationIndex(){
try {
JSONObject obj;
...
//The filters have been updated within the running activity
if(deepLink != null && mClient.isConnected()){
AppIndex.AppIndexApi.viewEnd(mClient, this, deepLink);
deepLink = null;
}
//Connect the client if it wasn't already
if(!mClient.isConnected())
mClient.connect();
//Report to google the deep link and the auto complete title
deepLink = Uri.parse(obj.getString(UriHandler.DEEP_LINK));
PendingResult<Status> result = AppIndex.AppIndexApi.view(mClient, this, deepLink, title, UriHandler.EMPTY_WEB_URI, null);
result.setResultCallback(new ResultCallback<Status>() {
@Override
public void onResult(Status status) {
if(status.isSuccess()){
Log.d(TAG, "App Indexing success " + title);
} else {
Log.d(TAG, "App Indexing failure: " + status.toString());
}
}
});
}
} catch (Exception e) {
Log.d("App Indexing", e.getMessage() + "");
if(mClient.isConnected())
mClient.disconnect();
}
}