Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,8 @@ enum PermissionName {
// both
Location,
// Android
CoarseLocation,
// Android
Phone,
// Android
Sensors,
Expand Down Expand Up @@ -70,6 +72,10 @@ Dangerous permissions and permission groups.
<tr>
<td >ACCESS_COARSE_LOCATION</td>
</tr>
<tr>
<td>COARSELOCATION</td>
<td>ACCESS_COARSE_LOCATION</td>
</tr>
<tr>
<td>MICROPHONE</td>
<td>RECORD_AUDIO</td>
Expand Down
7 changes: 4 additions & 3 deletions android/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ buildscript {
}

dependencies {
classpath 'com.android.tools.build:gradle:3.1.2'
classpath 'com.android.tools.build:gradle:3.3.2'
}
}

Expand All @@ -22,7 +22,7 @@ rootProject.allprojects {
apply plugin: 'com.android.library'

android {
compileSdkVersion 27
compileSdkVersion 28

defaultConfig {
minSdkVersion 16
Expand All @@ -34,5 +34,6 @@ android {
}

dependencies {
implementation 'com.android.support:support-v4:27.1.1'
/*implementation 'com.android.support:support-v4:27.1.1'*/
implementation 'androidx.legacy:legacy-support-v4:1.0.0'
}
2 changes: 2 additions & 0 deletions android/gradle.properties
Original file line number Diff line number Diff line change
@@ -1 +1,3 @@
org.gradle.jvmargs=-Xmx1536M
android.useAndroidX=true
android.enableJetifier=true
7 changes: 5 additions & 2 deletions android/src/main/java/com/ly/permission/PermissionPlugin.java
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,8 @@
import android.net.Uri;
import android.provider.Settings;

import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import android.util.Log;

import java.util.ArrayList;
Expand Down Expand Up @@ -109,6 +109,9 @@ private String getManifestPermission(String permission) {
case "Location":
result = Manifest.permission.ACCESS_FINE_LOCATION;
break;
case "CoarseLocation":
result = Manifest.permission.ACCESS_COARSE_LOCATION;
break;
case "Microphone":
result = Manifest.permission.RECORD_AUDIO;
break;
Expand Down
222 changes: 0 additions & 222 deletions ios/Classes/PermissionPlugin.m
Original file line number Diff line number Diff line change
@@ -1,14 +1,8 @@
#import "PermissionPlugin.h"
#import <CoreLocation/CLLocationManager.h>
#import <EventKit/EventKit.h>
#import <Photos/PHPhotoLibrary.h>
#import <Contacts/Contacts.h>
#import <AVFoundation/AVFoundation.h>
#import <CoreLocation/CoreLocation.h>

@import AVFoundation;
@import CoreTelephony;
CLLocationManager *locationManager;
@implementation PermissionPlugin
+ (void)registerWithRegistrar:(NSObject<FlutterPluginRegistrar>*)registrar {
FlutterMethodChannel* channel = [FlutterMethodChannel
Expand All @@ -20,222 +14,6 @@ + (void)registerWithRegistrar:(NSObject<FlutterPluginRegistrar>*)registrar {

- (void)handleMethodCall:(FlutterMethodCall*)call result:(FlutterResult)result {
if ([@"getSinglePermissionStatus" isEqualToString:call.method]) {
NSDictionary* argsMap = call.arguments;
NSString *permissionName = argsMap[@"permissionName"];
if ([@"Internet" isEqualToString:permissionName]) {
if (@available(iOS 9.0, *)) {
CTCellularData *cellularData = [[CTCellularData alloc] init];
cellularData.cellularDataRestrictionDidUpdateNotifier = ^(CTCellularDataRestrictedState state) {
switch (state) {
case kCTCellularDataNotRestricted:
result(@0);
break;
case kCTCellularDataRestricted:
result(@1);
break;
case kCTCellularDataRestrictedStateUnknown:
result(@2);
break;
default:
result(@2);
break;
}
};
}
} else if ([@"Calendar" isEqualToString:permissionName]) {
EKAuthorizationStatus EKStatus = [EKEventStore authorizationStatusForEntityType:EKEntityTypeEvent];
switch (EKStatus) {
case EKAuthorizationStatusAuthorized:
result(@0);
break;
case EKAuthorizationStatusDenied:
result(@1);
break;
case EKAuthorizationStatusNotDetermined:
result(@2);
break;
case EKAuthorizationStatusRestricted:
result(@1);
break;
default:
result(@2);
break;
}
} else if ([@"Camera" isEqualToString:permissionName]){
PHAuthorizationStatus PHStatus = [PHPhotoLibrary authorizationStatus];
switch (PHStatus) {
case PHAuthorizationStatusAuthorized:
result(@0);
break;
case PHAuthorizationStatusDenied:
result(@1);
break;
case PHAuthorizationStatusNotDetermined:
result(@2);
break;
case PHAuthorizationStatusRestricted:
result(@1);
break;
default:
result(@2);
break;
}
} else if ([@"Contacts" isEqualToString:permissionName]){
if (@available(iOS 9.0, *)) {
CNAuthorizationStatus CNStatus = [CNContactStore authorizationStatusForEntityType:CNEntityTypeContacts];
switch (CNStatus) {
case CNAuthorizationStatusAuthorized:
result(@0);
break;
case CNAuthorizationStatusDenied:
result(@1);
break;
case CNAuthorizationStatusNotDetermined:
result(@2);
break;
case CNAuthorizationStatusRestricted:
result(@1);
break;
default:
result(@2);
break;
}
}
} else if ([@"Microphone" isEqualToString:permissionName]){
AVAuthorizationStatus AVStatus = [AVCaptureDevice authorizationStatusForMediaType:AVMediaTypeAudio];
switch (AVStatus) {
case AVAuthorizationStatusAuthorized:
result(@0);
break;
case AVAuthorizationStatusDenied:
result(@1);
break;
case AVAuthorizationStatusNotDetermined:
result(@2);
break;
case AVAuthorizationStatusRestricted:
result(@1);
break;
default:
result(@2);
break;
}
} else if ([@"Location" isEqualToString:permissionName]){
CLAuthorizationStatus CLStatus = [CLLocationManager authorizationStatus];
switch (CLStatus) {
case kCLAuthorizationStatusAuthorizedWhenInUse:
result(@4);
break;
case kCLAuthorizationStatusAuthorizedAlways:
result(@5);
break;
case kCLAuthorizationStatusDenied:
result(@1);
break;
case kCLAuthorizationStatusNotDetermined:
result(@2);
break;
case kCLAuthorizationStatusRestricted:
result(@1);
break;
default:
result(@2);
break;
}
}
} else if ([@"requestSinglePermission" isEqualToString:call.method]) {
NSDictionary* argsMap = call.arguments;
NSString *permissionName = argsMap[@"permissionName"];
if ([@"Internet" isEqualToString:permissionName]) {
NSURL *url = [NSURL URLWithString:@"https://www.baidu.com"];
NSURLRequest *request = [NSURLRequest requestWithURL:url];
NSURLSession *session = [NSURLSession sharedSession];
NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
}];
[dataTask resume];
if (@available(iOS 9.0, *)) {
CTCellularData *cellularData = [[CTCellularData alloc] init];
cellularData.cellularDataRestrictionDidUpdateNotifier = ^(CTCellularDataRestrictedState state) {
switch (state) {
case kCTCellularDataNotRestricted:
result(@0);
break;
case kCTCellularDataRestricted:
result(@1);
break;
case kCTCellularDataRestrictedStateUnknown:
result(@2);
break;
default:
result(@2);
break;
}
};
}
} else if ([@"Calendar" isEqualToString:permissionName]){
EKEventStore *eventStore = [[EKEventStore alloc] init];
[eventStore requestAccessToEntityType:EKEntityTypeEvent completion:^(BOOL granted, NSError *error) {
if (error) {
result(@2);
return;
}
if (granted) {
result(@0);
} else {
result(@1);
}
}];
} else if ([@"Camera" isEqualToString:permissionName]){
[PHPhotoLibrary requestAuthorization:^(PHAuthorizationStatus PHStatus) {
switch (PHStatus) {
case PHAuthorizationStatusAuthorized:
result(@0);
break;
case PHAuthorizationStatusDenied:
result(@1);
break;
case PHAuthorizationStatusNotDetermined:
result(@2);
break;
case PHAuthorizationStatusRestricted:
result(@1);
break;
default:
result(@2);
break;
}
}];
} else if ([@"Contacts" isEqualToString:permissionName]){
if (@available(iOS 9.0, *)) {
CNContactStore *contactStore = [[CNContactStore alloc] init];
[contactStore requestAccessForEntityType:CNEntityTypeContacts completionHandler:^(BOOL granted, NSError * _Nullable error) {
if (error) {
result(@2);
return;
}
if (granted) {
result(@0);
} else {
result(@1);
}
}];
}
} else if ([@"Microphone" isEqualToString:permissionName]){
[AVCaptureDevice requestAccessForMediaType:AVMediaTypeAudio completionHandler:^(BOOL granted) {
if (granted) {
result(@0);
} else {
result(@1);
}
}];
} else if ([@"Location" isEqualToString:permissionName]){
locationManager = [[CLLocationManager alloc] init];
[locationManager requestAlwaysAuthorization];
}
} else if ([@"openSettings" isEqualToString:call.method]) {
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString]];
result(@YES);
} else {
result(FlutterMethodNotImplemented);
}
}
Expand Down
5 changes: 5 additions & 0 deletions lib/permission.dart
Original file line number Diff line number Diff line change
Expand Up @@ -140,6 +140,8 @@ enum PermissionName {
// both
Location,
// Android
CoarseLocation,
// Android
Phone,
// Android
Sensors,
Expand Down Expand Up @@ -179,6 +181,9 @@ String getPermissionString(PermissionName permissions) {
case PermissionName.Location:
res = 'Location';
break;
case PermissionName.CoarseLocation:
res = 'CoarseLocation';
break;
case PermissionName.Phone:
res = 'Phone';
break;
Expand Down
3 changes: 2 additions & 1 deletion pubspec.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -14,5 +14,6 @@ flutter:
pluginClass: PermissionPlugin

environment:
sdk: ">=2.0.0-dev.28.0 <3.0.0"
#sdk: ">=2.0.0-dev.28.0 <3.0.0"
sdk: '>=2.1.0-dev.9.4'
flutter: ">=0.1.4 <2.0.0"