Skip to content

Commit

Permalink
android 6+: ask for storage permission
Browse files Browse the repository at this point in the history
  • Loading branch information
axxapy committed Oct 13, 2017
1 parent 633b042 commit 44deaa1
Show file tree
Hide file tree
Showing 6 changed files with 167 additions and 8 deletions.
4 changes: 2 additions & 2 deletions AndroidManifest.xml
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="axp.tool.apkextractor"
android:versionCode="2"
android:versionName="1.1">
android:versionCode="3"
android:versionName="1.2">

<uses-permission android:name="android.permission.ACCESS_SUPERUSER" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
Expand Down
5 changes: 2 additions & 3 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ buildscript {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:2.2.2'
classpath 'com.android.tools.build:gradle:2.3.3'
}
}

Expand All @@ -15,7 +15,7 @@ repositories {

android {
compileSdkVersion 25
buildToolsVersion "25.0.3"
buildToolsVersion "26.0.2"

compileOptions {
sourceCompatibility JavaVersion.VERSION_1_6
Expand Down Expand Up @@ -47,7 +47,6 @@ android {
}

dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:appcompat-v7:25.3.1'
compile 'com.android.support:recyclerview-v7:25.3.1'
compile 'com.android.support:cardview-v7:25.3.1'
Expand Down
3 changes: 3 additions & 0 deletions res/values/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -13,5 +13,8 @@
<string name="alert_root_body">It seems that this application cannot be extracted through regular way. It is okay for paid apps: android tries to protect them from copying. However they are still extractable on rooted devices. If your device is rooted, apkExtractor could try to extract it using root.</string>
<string name="alert_root_yes">Lets try with root</string>
<string name="alert_root_no">Not now</string>
<string name="alert_perm_title">Permission required</string>
<string name="alert_perm_body">In order to write apk file application must be granted with \"Storage\" permission.\nPlease, open app\'s settings and grant \"Storage\" permission to it.</string>
<string name="alert_perm_btn">Open settings</string>

</resources>
2 changes: 1 addition & 1 deletion src/axp/tool/apkextractor/ApkListAdapter.java
Original file line number Diff line number Diff line change
Expand Up @@ -136,7 +136,7 @@ public ViewHolder(View v, ApkListAdapter adapter) {

@Override
public void onClick(View v) {
ApplicationInfo info = adapter.getItem(getPosition());
ApplicationInfo info = adapter.getItem(getAdapterPosition());
adapter.mActivity.doExctract(info);
}

Expand Down
19 changes: 17 additions & 2 deletions src/axp/tool/apkextractor/MainActivity.java
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,9 @@
import android.content.pm.PackageManager;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v4.view.MenuItemCompat;
import android.support.v7.app.ActionBarActivity;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.SearchView;
Expand All @@ -22,10 +23,11 @@

import java.util.List;

public class MainActivity extends ActionBarActivity {
public class MainActivity extends AppCompatActivity {
private ApkListAdapter apkListAdapter;

private ProgressBar progressBar;
private PermissionResolver permissionResolver;

@Override
protected void onCreate(Bundle savedInstanceState) {
Expand All @@ -44,6 +46,17 @@ protected void onCreate(Bundle savedInstanceState) {
progressBar.setVisibility(View.VISIBLE);

new Loader(this).execute();

permissionResolver = new PermissionResolver(this);
}



@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
if (!permissionResolver.onRequestPermissionsResult(requestCode, permissions, grantResults)) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
}
}

public void hideProgressBar() {
Expand Down Expand Up @@ -86,6 +99,8 @@ public boolean onQueryTextChange(String s) {
}

public void doExctract(final ApplicationInfo info) {
if (!permissionResolver.resolve()) return;

final Extractor extractor = new Extractor();
try {
String dst = extractor.extractWithoutRoot(info);
Expand Down
142 changes: 142 additions & 0 deletions src/axp/tool/apkextractor/PermissionResolver.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,142 @@
package axp.tool.apkextractor;

import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Build;
import android.provider.Settings;
import android.support.annotation.NonNull;
import android.support.v7.app.AlertDialog;

import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;

public class PermissionResolver {
private static final int REQUEST_CODE = 100500;

private static final String[] DEFAULT_PERMISSIONS = new String[] {
"android.permission.ACCESS_LOCATION_EXTRA_COMMANDS",
"android.permission.ACCESS_NETWORK_STATE",
"android.permission.ACCESS_NOTIFICATION_POLICY",
"android.permission.ACCESS_WIFI_STATE",
"android.permission.ACCESS_WIMAX_STATE",
"android.permission.BLUETOOTH",
"android.permission.BLUETOOTH_ADMIN",
"android.permission.BROADCAST_STICKY",
"android.permission.CHANGE_NETWORK_STATE",
"android.permission.CHANGE_WIFI_MULTICAST_STATE",
"android.permission.CHANGE_WIFI_STATE",
"android.permission.CHANGE_WIMAX_STATE",
"android.permission.DISABLE_KEYGUARD",
"android.permission.EXPAND_STATUS_BAR",
"android.permission.FLASHLIGHT",
"android.permission.GET_ACCOUNTS",
"android.permission.GET_PACKAGE_SIZE",
"android.permission.INTERNET",
"android.permission.KILL_BACKGROUND_PROCESSES",
"android.permission.MODIFY_AUDIO_SETTINGS",
"android.permission.NFC",
"android.permission.READ_SYNC_SETTINGS",
"android.permission.READ_SYNC_STATS",
"android.permission.RECEIVE_BOOT_COMPLETED",
"android.permission.REORDER_TASKS",
"android.permission.REQUEST_INSTALL_PACKAGES",
"android.permission.SET_TIME_ZONE",
"android.permission.SET_WALLPAPER",
"android.permission.SET_WALLPAPER_HINTS",
"android.permission.SUBSCRIBED_FEEDS_READ",
"android.permission.TRANSMIT_IR",
"android.permission.USE_FINGERPRINT",
"android.permission.VIBRATE",
"android.permission.WAKE_LOCK",
"android.permission.WRITE_SYNC_SETTINGS",
"com.android.alarm.permission.SET_ALARM",
"com.android.launcher.permission.INSTALL_SHORTCUT",
"com.android.launcher.permission.UNINSTALL_SHORTCUT",
"android.permission.ACCESS_SUPERUSER"
};

private Activity activity;

public PermissionResolver(Activity a) {
this.activity = a;
}

public boolean resolve() {
if (Build.VERSION.SDK_INT < 23) return true;

String[] unmet_permissions = getUnmetPermissions();
if (unmet_permissions.length < 1) return true;

activity.requestPermissions(unmet_permissions, REQUEST_CODE);

return false;
}

@SuppressLint("NewApi")
private String[] getUnmetPermissions() {
List<String> unmet_permissions = new LinkedList<String>();
try {
List<String> def = Arrays.asList(DEFAULT_PERMISSIONS);
PackageInfo info = activity.getPackageManager().getPackageInfo(activity.getPackageName(), PackageManager.GET_PERMISSIONS);
for (String perm : info.requestedPermissions) {
if (def.contains(perm)) continue;
if (activity.checkSelfPermission(perm) == PackageManager.PERMISSION_GRANTED) continue;
unmet_permissions.add(perm);
}
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
return new String[0];
}

if (unmet_permissions.size() < 1) return new String[0];

String[] arr = new String[unmet_permissions.size()];
unmet_permissions.toArray(arr);
return arr;
}

public boolean onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
if (requestCode != REQUEST_CODE) return false;

boolean granted = true;
for (int result : grantResults) {
if (result != PackageManager.PERMISSION_GRANTED) {
granted = false;
break;
}
}

if (granted) return true;

showPermissionDialog();

return true;
}

private void showPermissionDialog() {
new AlertDialog.Builder(activity)
.setMessage(R.string.alert_perm_body)
.setTitle(R.string.alert_perm_title)
.setPositiveButton(R.string.alert_perm_btn, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
activity.startActivity(new Intent()
.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS)
.addCategory(Intent.CATEGORY_DEFAULT)
.setData(Uri.parse("package:" + activity.getApplicationContext().getPackageName()))
.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY)
.addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS)
);
}
})
.create()
.show();
}
}

0 comments on commit 44deaa1

Please sign in to comment.