0

Для устройств Android с API 23 или выше, как я могу предоставить внешние разрешения на хранение без перезапуска приложения (вроде как музыкальная библиотека пользователя, загружаемая в Google Play Музыку за один сеанс) ? Я знаю, что эта проблема была рассмотрена несколько раз здесь, в SO, но пока я не нахожу удачи.Предоставление внешних разрешений на хранение без перезапуска приложения

Вот разрешения в моем файле манифеста:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> 
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> 

MainActivity:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { // API 23 
     if (checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE) 
       != PackageManager.PERMISSION_GRANTED) { 

      requestPermissions(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, 1); 

      return; // Included here to prevent the app from crashing. 
     } 
    } 

    /** 
    * CODE HERE FOR INSTANTIATIONS AND SUCH. 
    */ 
} 

... Так как сейчас, мне нужно перезапустить приложение для разрешения пойти через (и экземпляры MainActivity и т. д.) после Принимая разрешения от начального всплывающего окна.

Спасибо, кучка.

+2

«Мне нужно перезапустить приложение для разрешения пройти» - нет, вы этого не делаете. Переместите «КОД ЗДЕСЬ ДЛЯ УЧРЕЖДЕНИЙ И ТАКИХ». в другой метод. Вызовите этот метод из 'onCreate()', если у вас уже есть разрешения уже в этот момент. Также вызывается этот метод из 'onRequestPermissionsResult()', если пользователь согласился на эти разрешения. См. [Этот пример проекта] (https://github.com/commonsguy/cw-omnibus/tree/master/Files/FilesEditor), например. – CommonsWare

ответ

1

Как предложил @CommonsWare, вы можете поместить весь код, который делает Instantiations И ТАКИЕ в методе, как instantiateMyObjects() и называют, что в onCreate() как

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { // API 23 
     if (checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE) 
       != PackageManager.PERMISSION_GRANTED) { 

      requestPermissions(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, MY_PERMISSION_CODE); 
      // Define the constant MY_PERMISSION_CODE. 

      return; // Included here to prevent the app from crashing. 
     } 
    } 

    instantiateMyObjects(); 
} 

И когда пользователь принимает/запрещает ваш запрос разрешения onRequestPermissionsResult() называется. Не забудьте указать MY_PERMISSION_CODE, например, 1.

@Override 
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { 

    if (requestCode == MY_PERMISSION_CODE) { 
     if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { 
      // Now you can instantiate your objects. 
      instantiateMyObjects(); 
     } else { 
      // User denied it. 
     } 
    } 
}