9

私は現在、Android 用のシンプルな RSS アプリを開発しています。アプリの機能の 1 つは、クロム カスタム タブで URL を開くことです。ドキュメントで利用可能なサンプルに基づいて、Chrome カスタム タブを実装しました。

ほとんどの URL は Uri として解析することで正常に表示されましたが、渡した URL の 1 つは、カスタム タブを開こうとしたときにクラッシュを引き起こしました。これは次のような形式でした。

tag:github.com,2008:PullRequestReviewCommentEvent/4172209621

この文字列の URL をメソッドで解析するだけではいけないとUri.parse()思いますが、ここで何をすべきかを知りたくて困っています。

また、これは次の質問と同様の質問であると推測しています: Chrome custom tabs not opening other apps

クラッシュは、このインテントを処理できる利用可能なアクティビティがないようです:

FATAL EXCEPTION: main
android.content.ActivityNotFoundException: No Activity found to handle Intent { act=android.intent.action.VIEW dat=tag:github.com,2008:PullRequestReviewCommentEvent/4172209621 (has extras) }
    at android.app.Instrumentation.checkStartActivityResult(Instrumentation.java:1798)
    at android.app.Instrumentation.execStartActivity(Instrumentation.java:1512)
    at android.app.Activity.startActivityForResult(Activity.java:3930)
    at android.support.v4.app.BaseFragmentActivityJB.startActivityForResult(BaseFragmentActivityJB.java:48)
    at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:75)
    at android.app.Activity.startActivityForResult(Activity.java:3890)
    at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:871)
    at android.app.Activity.startActivity(Activity.java:4213)
    at android.support.v4.app.ActivityCompatJB.startActivity(ActivityCompatJB.java:27)
    at android.support.v4.app.ActivityCompat.startActivity(ActivityCompat.java:134)
    at android.support.customtabs.CustomTabsIntent.launchUrl(CustomTabsIntent.java:244)
    at butterknife.internal.DebouncingOnClickListener.onClick(DebouncingOnClickListener.java:22)
    at android.view.View.performClick(View.java:5204)
    at android.view.View$PerformClick.run(View.java:21155)
    at android.os.Handler.handleCallback(Handler.java:739)
    at android.os.Handler.dispatchMessage(Handler.java:95)
    at android.os.Looper.loop(Looper.java:148)
    at android.app.ActivityThread.main(ActivityThread.java:5422)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)

以下は、Chrome カスタム タブで URL を開くことに関して、これまでに書いたソース コードです。

public class ArticleFragment extends Fragment {

  @OnClick(R.id.button_see_more) public void onClickSeeMore() {
    launchCustomTabs(article.url());
  }

  private CustomTabsServiceConnection customTabsConnection;
  private CustomTabsClient customTabsClient;
  private CustomTabsSession customTabsSession;

  @Override public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);

    ...

    bindCustomTabsService();
  }

  @Override public void onDestroy() {
    unbindCustomTabsService();
    super.onDestroy();
  }

  private void bindCustomTabsService() {
    if (customTabsClient != null) {
      return;
    }

    customTabsConnection = new CustomTabsServiceConnection() {
      @Override public void onCustomTabsServiceConnected(ComponentName componentName,
          CustomTabsClient customTabsClient) {
        ArticleSummaryDetailFragment.this.customTabsClient = customTabsClient;
        customTabsSession = customTabsClient.newSession(new CustomTabsCallback() {
          @Override public void onNavigationEvent(int navigationEvent, Bundle extras) {
            Timber.wtf("onNavigationEvent: Code = " + navigationEvent);
          }
        });

        customTabsSession.mayLaunchUrl(Uri.parse(article.originId()), null, null);
        customTabsClient.warmup(0L);
      }

      @Override public void onServiceDisconnected(ComponentName componentName) {
        customTabsClient = null;
      }
    };

    CustomTabsClient.bindCustomTabsService(getActivity(), getActivity().getPackageName(),
        customTabsConnection);
  }

  private void unbindCustomTabsService() {
    if (customTabsConnection == null) {
      return;
    }

    getActivity().unbindService(customTabsConnection);
    customTabsClient = null;
    customTabsSession = null;
  }

  private void launchCustomTabs(String url) {
    CustomTabsIntent customTabsIntent = new CustomTabsIntent.Builder(customTabsSession).build();
    customTabsIntent.launchUrl(getActivity(), Uri.parse(url));
  }
}
4

3 に答える 3

6

これは、Android の一般的な動作です。起動している URI を個々のアプリで解析できない場合は、そのエラーを適切に処理する必要があります。ユーザーがその URI を実際に解釈できるアプリを持っているかどうかに依存するため、この状態でできることは何もありません。

その例外を処理する必要があります。ライブラリの問題ではありません。また、Chrome のカスタム タブとして、おそらくそのようなリンクではなく、Web ページのリンクを期待しています。実際、おそらくその URI を解釈できる唯一のアプリは、github アプリでしょう。

どのアプリも処理できないアクティビティのインテントを起動しようとすると、Android の標準的な動作はクラッシュします。

PackageManager API を活用して、誰かがそのインテントを処理できるかどうかを検出できる場合があります。

于 2016-09-02T20:09:26.557 に答える
-2

このコードは私にとってはうまくいきます。RSSフィードアプリにもこれを使用します

 CustomTabsIntent.Builder builder = new CustomTabsIntent.Builder();
            CustomTabsIntent customTabsIntent = builder.build();
            customTabsIntent.launchUrl(MainActivity.activity, Uri.parse(mDataSet.get(getAdapterPosition()).getPostLink()));
于 2016-09-02T19:48:03.807 に答える