Как получить CameraManager в ViewModel без ссылки на мою деятельность / контекст? - PullRequest
0 голосов
/ 30 апреля 2019

В моем приложении я использую Android Jetpack, а также компонент архитектуры навигации.Итак, теперь я хотел добавить свой фрагмент настроек с несколькими фрагментами настроек.Навигация пока работает нормально, и проблем нет - теперь я получил фрагмент настроек камеры, где пользователь может сделать некоторые настройки камеры.Дело в том, что теперь я хотел заполнить ListPreference возможными разрешениями, которые обеспечивает камера устройства.Так что все мои установочные фрагменты должны использовать мой единственный SettingsViewModel для хранения данных.Я думал, что мог бы сделать метод в своем SettingsViewModel для получения этих разрешений, но я не знаю, как получить CameraManager, не нарушая ссылку на мою деятельность.

MainActivity.java

    public class MainActivity extends AppCompatActivity implements
        NavigationView.OnNavigationItemSelectedListener,
        ActivityCompat.OnRequestPermissionsResultCallback,
        PreferenceFragmentCompat.OnPreferenceStartFragmentCallback{

...

    @Override
    public boolean onPreferenceStartFragment(PreferenceFragmentCompat caller, Preference pref) {

        switch (pref.getTitle().toString()){
            case "Camera":
                Log.i(TAG, "camera settings selected");

                navController.navigate(R.id.cameraSettingFragment);

                }
        return true;
    }

CameraSettingFragment.java

    public class CameraSettingFragment extends PreferenceFragmentCompat {

    private static final String TAG = "CameraSettingFragment";

    private SettingsViewModel mViewModel;

    @Override
    public void onCreatePreferences(@Nullable Bundle savedInstanceState, @Nullable String rootKey) {
        setPreferencesFromResource(R.xml.camera_preferences, rootKey);

        mViewModel = ViewModelProviders.of(this).get(SettingsViewModel.class);

        setupCameraPreferences();

    }

    private void setupCameraPreferences() {

        getPossibleFrameRateRanges();

        getPossibleCameraResolutions();

    }



    private void getPossibleFrameRateRanges(){

        final ListPreference listPreference = findPreference("framerate");

        CharSequence[] entries = listPreference.getEntries();

        if(entries == null){

            mViewModel.getPossibleFrameRateRanges();

        }

И моя ViewModel, где я хотел кое-что рассказать о характеристиках камеры

    import static android.content.Context.CAMERA_SERVICE;

    public class SettingsViewModel extends AndroidViewModel {

    public SettingsViewModel(@NonNull Application application) {
        super(application);
    }

    public void doAction() {
        // depending on the action, do necessary business logic calls
    }

    public void getPossibleFrameRateRanges() {
        // THIS LINE IS BUGGY AND NEEDS A FIX
        CameraManager manager = (CameraManager) getSystemService(CAMERA_SERVICE);
    }
}

Так как мне не нарушать эти строки:

Внимание : ViewModel никогда не должен ссылаться на представление, жизненный цикл или любой класс, который может содержать ссылку на контекст действия.

Или я пропустилчто-то?Заранее спасибо!

1 Ответ

0 голосов
/ 30 апреля 2019

Извините, что украл ваше время! Я не прочитал достаточно ... Я могу расширить свой класс SettingsViewModel с помощью AndroidViewModel и использовать application

    public class SettingsViewModel extends AndroidViewModel {

    private Application application;

    public SettingsViewModel(@NonNull Application application) {
        super(application);
        this.application = application;
    }

    public void doAction() {
        // depending on the action, do necessary business logic calls
    }

    public void getPossibleFrameRateRanges() {

        CameraManager manager = (CameraManager) application.getSystemService(CAMERA_SERVICE);
    }
}

Очень жаль и спасибо!

...