これが私のアクティビティ構造です: SplashActivity -> MainActivity. 私の MainActivity には、ContentProvider から取り込まれた Spinner があります。Spinner の選択に基づいて、さまざまなコンテンツをユーザーに提示します。コンテンツは、私の Web サイトのコンテンツに完全に対応しています。私のウェブサイトは長い間インデックスされており、正常に機能しています。今、私は自分のアプリでそのコンテンツにインデックスを付けたいと思っています。
これが私のマニフェストです
<activity android:name=".activities.SplashActivity"
android:theme="@style/SplashTheme">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value=".activities.MainActivity"/>
<intent-filter>
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="android.intent.category.BROWSABLE"/>
<data
android:host="www.business.com"
android:scheme="http"/>
<data
android:host="www.business.com"
android:scheme="https"/>
<data
android:host="business.com"
android:scheme="http"/>
<data
android:host="business.com"
android:scheme="https"/>
<data
android:host="/*"
android:scheme="business"/>
<data android:scheme="android-app"
android:host="com.business.android" />
</intent-filter>
</activity>
これが私の MainActivity の app-indexing 部分です
@Override
public void onStart() {
super.onStart();
appIndexingTask();
}
private void appIndexingTask() {
new AsyncTask() {
@Override
protected Object doInBackground(Object[] params) {
try {
if(null == mNdxClient){
mNdxClient = new GoogleApiClient.Builder(MainActivity.this)
.enableAutoManage(MainActivity.this, MainActivity.this)
.addApi(AppInvite.API).addApi(AppIndex.API)
.build();
}
if(!mNdxClient.isConnected()){
mNdxClient.blockingConnect();
}
if (mNdxClient != null && mNdxClient.isConnected()) {
HashMap<Uri, Action> indexedActions = new HashMap<>();
List<Content> contentList = getAllFromContentProvider();
for(Content c: contentList){
Uri uri = Uri.parse(FirebaseUtils.appIndexingLink(c.getUrl()));
Action action = getAction(c.getName(), c.getDescription(), uri);
AppIndex.AppIndexApi.start(mNdxClient, action);
indexedActions.put(uri, action);
}
for (Action action : indexedActions.values()) {
AppIndex.AppIndexApi.end(mNdxClient, indexedActions.get(action));
}
}
} catch (Exception e) {
//abandon task
}
return null;
}
public Action getAction(String title, String description, Uri uri) {
Thing object = new Thing.Builder()
.setName(title)
.setDescription(description)
.setUrl(uri)
.build();
return new Action.Builder(Action.TYPE_VIEW)
.setObject(object)
.setActionStatus(Action.STATUS_TYPE_COMPLETED)
.build();
}
}.execute();
}
これがユーティリティメソッドです
public static String appIndexingLink(String urlString){
String appNdx= new StringBuilder("android-app://").append(BASE_URL).append(urlString).toString();
return appNdx;
}
最後に、使用しているgradleで
classpath 'com.google.gms:google-services:3.0.0'//project level
//app level
compile 'com.google.android.gms:play-services-appindexing:9.0.0'
compile 'com.google.firebase:firebase-core:9.0.0'
compile "com.google.firebase:firebase-messaging:9.0.0"
compile "com.google.firebase:firebase-invites:9.0.0"
重要なポイント
- App-Invite の動作: 招待を送信してから招待を開くことができます (コードは表示されていません)
- ディープ リンクは機能します。自分のサイトへのリンクを自分に送信すると、Android フォンでリンクを開くと、アプリで完全に開きます。
- Google 検索でアプリがインデックスに登録されていない
- Play ストアまたはローカル apk のどちらを指定しても、Fetch as Google は「URI がサポートされていません」で失敗します。
フィルターに注目
<data android:scheme="android-app"
android:host="com. business.android" />
ドキュメントのどこにも表示されません。しかし、他に何も機能しません。だから私はそれを追加しました。まだ機能していません。
私はログを表示していませんが。ログを記録しているので、アプリのインデックス作成コードが実行されていることがわかります。