2016-11-17 10 views
2

スマートロックAPIを使用して、アンドロイドアプリのリファクタリングを実行しているときに、ResolvingResultCallbacksオブジェクトにFragmentを渡すことができません。フラグメントを使用してアクティビティを使用する代わりにSmartLockの保存を開始する方法

APIは、アクティビティをコンテキストとして渡すことしかできません。つまり、Fragmentの代わりにActivityのonActivityResult()メソッドで資格情報の結果を処理する必要があります。しかし、私たちのアプリの現在のデザインでは、Fragmentがスマートロックロジックを扱うようにしたいと考えています。

ここに保存するための私のコードです:

Auth.CredentialsApi.save(mSmartLockApiClient, credential).setResultCallback(
    new ResolvingResultCallbacks<Status>(mActivity, RC_CREDENTIALS_SAVE) { 
     @Override 
     public void onSuccess(Status status) {        
     mSmartLockSaveCallBack.onSuccess(); 
     } 

     @Override 
     public void onUnresolvableFailure(Status status) {} 
    }); 

を実際に資格情報を要求するためには、私は同じ問題を持っていた、APIのdoesntのは、解像度を開始するフラグメントを渡す方法を提供します。しかし、私は、回避策を見つける:

if (status.hasResolution()) { 
    mFragment.startIntentSenderForResult(
     status.getResolution().getIntentSender(), 
     RC_CREDENTIALS_READ, 
     null, 
     0, 
     0, 
     0, 
     null); 
} 

答えて

3

私はそれがResolvingResultCallbacksが直接フラグメントをサポートしていないが残念だということに同意しますが、実装は実際にはかなり簡単です。ここでフラグメントをサポートしている変異体である:

public abstract class ResolvingResultCallbacks<R extends Result> 
    extends ResultCallbacks<R> { 
    private static final String TAG = "ResolvingResultCallback"; 

    private final Fragment mFragment; 
    private final int mRequestCode; 

    protected ResolvingResultCallbacks(
     @NonNull Fragment fragment, 
     int requestCode) { 
    mFragment = fragment; 
    mRequestCode = requestCode; 
    } 

    @Override 
    public final void onFailure(@NonNull Status result) { 
    if (result.hasResolution()) { 
     try { 
     mFragment.startIntentSenderForResult(
      result.getResolution().getIntentSender(), 
      mRequestCode, 
      null, // fillInIntent, 
      0, // flagsMask, 
      0, // flagsValues 
      0, // extraFlags 
      null); // options 
     } catch (IntentSender.SendIntentException ex) { 
     Log.e(TAG, "Failed to start resolution", ex); 
     onUnresolvableFailure(
      new Status(CommonStatusCodes.INTERNAL_ERROR)); 
     } 
    } else { 
     onUnresolvableFailure(result); 
    } 
    } 

    @Override 
    public abstract void onSuccess(@NonNull R result); 

    @Override 
    public abstract void onUnresolvableFailure(@NonNull Status result); 
} 

startIntentSenderForResultは唯一のAPI V24にネイティブFragmentタイプに追加されたので、あなたはおそらく代わりにサポートFragment実装を使用する必要があります。

私はこれをテストしていないので、あなたのために働いていれば教えてください。

+0

ありがとうございます!それは完璧に正常に動作します。ただし、mFragment.startIntentSenderForResultのいくつかのパラメータが不足している点が異なります。 XD – Qing

+0

私に知らせてくれてありがとう、私は今それを修正しました。 – iainmcgin

関連する問題