2016-11-17 4 views
2

smartlock API가 Outroid App 용 리팩토링을 수행 할 때 ResolvingResultCallbacks 객체에 Fragment를 전달할 수 없다는 것을 알았습니다.액티비티 대신 스마트 키 저장을 시작하기 위해 조각을 사용하는 방법

API를 사용하면 Activity를 컨텍스트로 전달할 수 있습니다. 즉, Fragment 's 대신 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는 해상도를 시작 조각을 통과 할 수있는 방법을 제공 나던. 하지만 난 해결 방법 찾기 :

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