2016-11-17 5 views
2

Я только понял, что smartlock api не позволяет передавать фрагмент объекту ResolvingResultCallbacks, когда я делал рефакторинг для приложения Android.Как использовать фрагмент для запуска экономии Smartlock вместо использования Activity

API только позволяет мне передать действие как контекст, что означает, что мне нужно обработать результат учетных данных в методе onActivityResult() Activity вместо фрагмента. Но в текущем проекте нашего приложения мы хотим, чтобы Фрагмент обрабатывал логику смартфонов.

Вот мой код для сохранения:

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) {} 
    }); 

фактически для запроса учетных данных, я была такая же проблема, то апи оленья кожа обеспечивает способ передачи фрагмента, чтобы начать разрешение. но я найти обходной путь:

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 было добавлено только в родной Fragment типа в API v24, так что вы, вероятно, необходимо использовать для поддержки реализации Fragment вместо этого.

Я не тестировал это, поэтому, пожалуйста, дайте мне знать, если это сработает для вас.

+0

спасибо! он работает отлично. за исключением того, что вы пропускаете некоторые параметры в mFragment.startIntentSenderForResult. XD – Qing

+0

Спасибо, что сообщили мне, я исправил его сейчас. – iainmcgin