Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/florent37/runtimepermission

Simpliest way to ask runtime permissions on Android, no need to extend class or override permissionResult method, choose your way : Kotlin / Coroutines / RxJava / Java7 / Java8
https://github.com/florent37/runtimepermission

android async coroutines kotlin lambda launch manifest marshmallow permission runtime rx rxjava

Last synced: 6 days ago
JSON representation

Simpliest way to ask runtime permissions on Android, no need to extend class or override permissionResult method, choose your way : Kotlin / Coroutines / RxJava / Java7 / Java8

Awesome Lists containing this project

README

        

Runtime Permission
===================

[![CircleCI](https://circleci.com/gh/florent37/RuntimePermission/tree/master.svg?style=svg)](https://circleci.com/gh/florent37/RuntimePermission/tree/master)
[![Language](https://img.shields.io/badge/compatible-java%20%7C%20kotlin%20%7C%20rx-brightgreen.svg)](https://www.github.com/florent37/RuntimePermission)

[![screen](https://raw.githubusercontent.com/florent37/RuntimePermission/master/medias/intro.png)](https://www.github.com/florent37/RuntimePermission)

Simpliest way to ask runtime permissions on Android, choose your way :
- [Kotlin](https://github.com/florent37/RuntimePermission#kotlin)
- [Kotlin with Coroutines](https://github.com/florent37/RuntimePermission#kotlin-coroutines)
- [RxJava](https://github.com/florent37/RuntimePermission#rxjava)
- [Java8](https://github.com/florent37/RuntimePermission#java8)
- [Java7](https://github.com/florent37/RuntimePermission#java7)

**No need to override Activity or Fragment**`onPermissionResult(code, permissions, result)`**using this library, you just have to executue RuntimePermission's methods**
This will not cut your code flow

# General Usage (cross language)

[ ![Download](https://api.bintray.com/packages/florent37/maven/runtime-permission/images/download.svg) ](https://bintray.com/florent37/maven/runtime-permission/)
```java
dependencies {
implementation 'com.github.florent37:runtime-permission:(lastest version)'
}
```

## Detect Permissions

RuntimePermission can automatically check **all** of your needed permissions

For example, if you add to your *AndroidManifest.xml* :

[![screen](https://raw.githubusercontent.com/florent37/RuntimePermission/master/medias/manifest-permissions.png)](https://www.github.com/florent37/RuntimePermission)

You can use `askPermission` without specifying any permission

For example, in Kotlin:
```
askPermission(){
//all of your permissions have been accepted by the user
}.onDeclined { e ->
//at least one permission have been declined by the user
}
```

[![screen](https://raw.githubusercontent.com/florent37/RuntimePermission/master/medias/permissions.png)](https://www.github.com/florent37/RuntimePermission)

Will automatically ask for **CONTACTS** and **LOCALISATION** permissions

## Manually call permissions

You just have to call `askPermission` with the list of wanted permissions

In Kotlin:
```
askPermission(Manifest.permission.READ_CONTACTS, Manifest.permission.ACCESS_FINE_LOCATION){
//all of your permissions have been accepted by the user
}.onDeclined { e ->
//at least one permission have been declined by the user
}
```

[![screen](https://raw.githubusercontent.com/florent37/RuntimePermission/master/medias/permissions.png)](https://www.github.com/florent37/RuntimePermission)

Will ask for **CONTACTS** and **LOCALISATION** permissions

# Kotlin-Coroutines

```kotlin
yourScope.launch {
try {
val result = askPermission(Manifest.permission.READ_CONTACTS, Manifest.permission.ACCESS_FINE_LOCATION)
//all permissions already granted or just granted
//your action
resultView.setText("Accepted :${result.accepted.toString()}")

} catch (e: PermissionException) {
if (e.hasDenied()) {
appendText(resultView, "Denied :")
//the list of denied permissions
e.denied.forEach { permission ->
appendText(resultView, permission)
}
//but you can ask them again, eg:

AlertDialog.Builder(this@RuntimePermissionMainActivityKotlinCoroutine)
.setMessage("Please accept our permissions")
.setPositiveButton("yes") { dialog, which ->
e.askAgain()
}
.setNegativeButton("no") { dialog, which ->
dialog.dismiss()
}
.show();
}

if (e.hasForeverDenied()) {
appendText(resultView, "ForeverDenied")
//the list of forever denied permissions, user has check 'never ask again'
e.foreverDenied.forEach { permission ->
appendText(resultView, permission)
}
//you need to open setting manually if you really need it
e.goToSettings();
}
}
}
```

### Download

[ ![Download](https://api.bintray.com/packages/florent37/maven/runtime-permission/images/download.svg) ](https://bintray.com/florent37/maven/runtime-permission/)
```groovy
implementation 'com.github.florent37:runtime-permission-kotlin:(last version)'
```

# Kotlin

```kotlin
askPermission(Manifest.permission.READ_CONTACTS, Manifest.permission.ACCESS_FINE_LOCATION){
//all permissions already granted or just granted

your action
}.onDeclined { e ->
if (e.hasDenied()) {
appendText(resultView, "Denied :")
//the list of denied permissions
e.denied.forEach {
appendText(resultView, it)
}

AlertDialog.Builder(this@RuntimePermissionMainActivityKotlin)
.setMessage("Please accept our permissions")
.setPositiveButton("yes") { dialog, which ->
e.askAgain();
} //ask again
.setNegativeButton("no") { dialog, which ->
dialog.dismiss();
}
.show();
}

if(e.hasForeverDenied()) {
appendText(resultView, "ForeverDenied :")
//the list of forever denied permissions, user has check 'never ask again'
e.foreverDenied.forEach {
appendText(resultView, it)
}
// you need to open setting manually if you really need it
e.goToSettings();
}
}
```

### Download

[ ![Download](https://api.bintray.com/packages/florent37/maven/runtime-permission/images/download.svg) ](https://bintray.com/florent37/maven/runtime-permission/)
```groovy
implementation 'com.github.florent37:runtime-permission-kotlin:(last version)'
```

# RxJava

```java
new RxPermissions(this).request(Manifest.permission.READ_CONTACTS, Manifest.permission.ACCESS_FINE_LOCATION))
.subscribe(result -> {
//all permissions already granted or just granted

your action
}, throwable -> {
final PermissionResult result = ((RxPermissions.Error) throwable).getResult();

if(result.hasDenied()) {
appendText(resultView, "Denied :");
//the list of denied permissions
for (String permission : result.getDenied()) {
appendText(resultView, permission);
}
//permission denied, but you can ask again, eg:

new AlertDialog.Builder(RuntimePermissionMainActivityRx.this)
.setMessage("Please accept our permissions")
.setPositiveButton("yes", (dialog, which) -> {
result.askAgain();
}) // ask again
.setNegativeButton("no", (dialog, which) -> {
dialog.dismiss();
})
.show();
}

if(result.hasForeverDenied()) {
appendText(resultView, "ForeverDenied :");
//the list of forever denied permissions, user has check 'never ask again'
for (String permission : result.getForeverDenied()) {
appendText(resultView, permission);
}
// you need to open setting manually if you really need it
result.goToSettings();
}
});
```

### Download
```groovy
implementation 'com.github.florent37:runtime-permission-rx:(last version)'
```

# Java8

```java
askPermission(this)
.request(Manifest.permission.READ_CONTACTS, Manifest.permission.ACCESS_FINE_LOCATION)

.onAccepted((result) -> {
//all permissions already granted or just granted

your action
})
.onDenied((result) -> {
appendText(resultView, "Denied :");
//the list of denied permissions
for (String permission : result.getDenied()) {
appendText(resultView, permission);
}
//permission denied, but you can ask again, eg:

new AlertDialog.Builder(RuntimePermissionMainActivityJava8.this)
.setMessage("Please accept our permissions")
.setPositiveButton("yes", (dialog, which) -> {
result.askAgain();
}) // ask again
.setNegativeButton("no", (dialog, which) -> {
dialog.dismiss();
})
.show();

})
.onForeverDenied((result) -> {
appendText(resultView, "ForeverDenied :");
//the list of forever denied permissions, user has check 'never ask again'
for (String permission : result.getForeverDenied()) {
appendText(resultView, permission);
}
// you need to open setting manually if you really need it
result.goToSettings();
})
.ask();
```

### Download

[ ![Download](https://api.bintray.com/packages/florent37/maven/runtime-permission/images/download.svg) ](https://bintray.com/florent37/maven/runtime-permission/)
```groovy
implementation 'com.github.florent37:runtime-permission:(last version)'
```

# Java7

```java
askPermission(this, Manifest.permission.READ_CONTACTS, Manifest.permission.ACCESS_FINE_LOCATION)
.ask(new PermissionListener() {
@Override
public void onAccepted(RuntimePermission runtimePermission, List accepted) {
//all permissions already granted or just granted

your action
}

@Override
public void onDenied(RuntimePermission runtimePermission, List denied, List foreverDenied) {
if(permissionResult.hasDenied()) {
appendText(resultView, "Denied :");
//the list of denied permissions
for (String permission : denied) {
appendText(resultView, permission);
}

//permission denied, but you can ask again, eg:

new AlertDialog.Builder(RuntimePermissionMainActivityJava7.this)
.setMessage("Please accept our permissions")
.setPositiveButton("yes", (dialog, which) -> {
permissionResult.askAgain();
}) // ask again
.setNegativeButton("no", (dialog, which) -> {
dialog.dismiss();
})
.show();
}

if(permissionResult.hasForeverDenied()) {
appendText(resultView, "ForeverDenied :");
//the list of forever denied permissions, user has check 'never ask again'
for (String permission : foreverDenied) {
appendText(resultView, permission);
}
// you need to open setting manually if you really need it
permissionResult.goToSettings();
}
}
});
```

# How to Contribute

We welcome your contributions to this project.

The best way to submit a patch is to send us a [pull request](https://help.github.com/articles/about-pull-requests/).

To report a specific problem or feature request, open a new issue on Github.

# Credits

Manifest permission detection has been forked from https://github.com/sensorberg-dev/permission-bitte,
thanks **Sensorberg GmbH**

Author: Florent Champigny

Blog : [http://www.tutos-android-france.com/](http://www.tutos-android-france.com/)

Fiches Plateau Moto : [https://www.fiches-plateau-moto.fr/](https://www.fiches-plateau-moto.fr/)


Android app on Google Play


Follow me on Google+


Follow me on Twitter


Follow me on LinkedIn

# License

Copyright 2018 florent37, Inc.

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.