2016-04-18 4 views
1

Я добавляю определенные разрешения для своего приложения, чтобы разрешить доступ к камере, например, и все работает нормально. но когда я скрою приложение и отключу разрешение, откройте приложение, приложение отключится, не попросив меня снова включить разрешение (пока я не закрою приложение и не открою его). как я могу исправить эту ошибку, чтобы приложение не сработало и снова попросило разрешения или безопасного перезапуска для запроса разрешений.Ошибка разрешения Marshmallow Android

вот мой код

в основной деятельности:

OnCreate:

if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) { 
      ActivityCompat.requestPermissions(this, 
        new String[]{Manifest.permission.CAMERA}, 
        GlobalVariables.MY_PERMISSIONS_REQUEST_CAMERA); 
     } 


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

      case GlobalVariables.MY_PERMISSIONS_REQUEST_CAMERA: 
      { 
       if (grantResults.length <= 0 
         || grantResults[0] != PackageManager.PERMISSION_GRANTED) { 
        globalVariables.ShowOKAlert("Error","Please Accept All Requested Permissions or the app wont function properly",this,false); 
       } 
       return; 
      } 
     } 
    } 

деятельность реализует ActivityCompat.OnRequestPermissionsResultCallback

+0

Обратите внимание, что при отключении разрешения в настройках, процесс вашего приложения завершается. – CommonsWare

+0

спасибо @CommonsWare, я думаю, из-за этого у меня есть некоторые ошибки в базе данных SQLITE –

+0

Попробуйте это, возможно, вам помогут: -http: //stackoverflow.com/a/41221852/5488468 –

ответ

0

Вы проверяете, что разрешение на onCreate. Когда вы снова минимизируете и увеличиваете приложение, этот метод не вызывается.

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

Призыв к onResume гарантирует, что приложение продолжит работу, если пользователь отключит разрешение в другом окне с разделенным экраном (функция Android N).

+0

ok спасибо, попробуем это. но ошибка появляется, как только я максимизирую приложение ... т. е. Я действительно не запускал камеру еще и все еще находился в основном действии –

+0

Можете ли вы опубликовать трассировку стека? – Massimo

+0

в трассировке стека, ошибка, которую я получаю при отключении любого разрешения, которое у меня есть (камера, местоположение, хранилище) - java.lang.NullPointerException: попытка вызвать виртуальный метод 'boolean android.database.sqlite.SQLiteDatabase.isOpen()' на ссылке нулевого объекта, которая не имеет смысла –

0

Простой способ для достижения этой цели использовать прямой статический метод ActivityCompat

public static void requestPermissions(final @NonNull Activity activity, 
      final @NonNull String[] permissions, final int requestCode) 

Здесь вы можете увидеть, какие параметры вы для этого требуется

-- Activity Instance

-- String array of permissions

-- a user defined request code

Использование

Определить глобальные переменные

//Run-time permissions for MarshMallow + 
    public final String[] PERMISSION_ALL = { 
      Manifest.permission.ACCESS_FINE_LOCATION, 
      Manifest.permission.ACCESS_COARSE_LOCATION, 
      Manifest.permission.CAMERA, 
      Manifest.permission.READ_EXTERNAL_STORAGE, 
      Manifest.permission.WRITE_EXTERNAL_STORAGE 
    }; 
    //validateRequestPermissionsRequestCode requires requestCode to be of 8 bits, i.e. range: 0-255. 
    public final int PERMISSION_REQUEST_CODE = 100; 

Наконец в вашем методе деятельности oncreate() вы можете вызывать статические функции упомянутые выше

public class MainActivity extends AppCompatActivity 
{ 
    //your code here 

    @Override 
    protected void onCreate(Bundle savedInstanceState) 
    { 
     //do other code work 

     super.onCreate(savedInstanceState); 

     int currentapiVersion = android.os.Build.VERSION.SDK_INT; 
     if (currentapiVersion >= android.os.Build.VERSION_CODES.M) 
     { 
      ActivityCompat.requestPermissions(this, PERMISSION_ALL, PERMISSION_REQUEST_CODE); 
     } 

     //do other code work 
    } 

    //your code here 
} 

И вы сделали ....

Для получения дополнительной информации Click here abou т Android разрешений во время выполнения

1

шаг 1:

String[] permissions = new String[]{ 
    Manifest.permission.INTERNET, 
    Manifest.permission.READ_PHONE_STATE, 
    Manifest.permission.READ_EXTERNAL_STORAGE, 
    Manifest.permission.WRITE_EXTERNAL_STORAGE, 
}; 

Шаг 2: -

private boolean checkPermissions() { 
    int result; 
    List<String> listPermissionsNeeded = new ArrayList<>(); 
    for (String p : permissions) { 
     result = ContextCompat.checkSelfPermission(this, p); 
     if (result != PackageManager.PERMISSION_GRANTED) { 
      listPermissionsNeeded.add(p); 
     } 
    } 
    if (!listPermissionsNeeded.isEmpty()) { 
     ActivityCompat.requestPermissions(this, listPermissionsNeeded.toArray(new String[listPermissionsNeeded.size()]), 100); 
     return false; 
    } 
    return true; 
} 

Шаг 3:

@Override 
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) { 
    if (requestCode == 100) { 
     if (grantResults.length > 0 
      && grantResults[0] == PackageManager.PERMISSION_GRANTED) { 
     // do something 
     } 
     return; 
    } 
} 
Смежные вопросы