非活动中的Android M onRequestPermissionsResult

时间:2016-07-20 11:57:58

标签: java android android-6.0-marshmallow

我有一个应用程序需要找到用户位置,并且在各个类中提取位置,所以我编写了一个单独的类(非活动类),使用位置服务,它在 Android M 下工作正常但在 Android M 中需要运行时权限,我想检查我的Location类中的权限,我知道如何检查它们但我不能在我的Location类中使用 onRequestPermissionsResult 方法,因为我的Location类不会从任何活​​动扩展。

那么我应该做些什么呢?任何帮助/线索表示赞赏 提前致谢

6 个答案:

答案 0 :(得分:10)

由于 public void onRequestPermissionsResult(int requestCode,                                            字符串权限[],int [] grantResults) ActivityCompat.OnRequestPermissionsResultCallback 接口的抽象方法。 看到 the documentation

只需在所需的类中实现此接口即可完成。 例如

class location implements  ActivityCompat.OnRequestPermissionsResultCallback{ }

现在只需覆盖 onRequestPermissionsResult()

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

答案 1 :(得分:7)

欢迎您从非UI类调用checkSelfPermission(),因为它只需要一些Context

但是,您必须在某些活动或片段上调用requestPermissions()。您在相同的活动或片段上覆盖onRequestPermissionsResult()。这与调用startActivityForResult()和实施onActivityResult()

没什么区别

我们的想法是,在您执行涉及处理位置的非UI类的任何操作之前,请求您的许可。

答案 2 :(得分:4)

1-创建透明活动

<activity android:name=".activity.activity.CheckStoragePermissionsActivity" android:theme="@style/Theme.Transparent">

<style name="Theme.Transparent" parent="Theme.AppCompat">
        <item name="android:windowIsTranslucent">true</item>
        <item name="android:windowBackground">@android:color/transparent</item>
        <item name="android:windowContentOverlay">@null</item>
        <item name="android:windowNoTitle">true</item>
        <item name="android:windowIsFloating">true</item>
        <item name="android:backgroundDimEnabled">false</item>
    </style>

2-自定义您的活动

public class CheckStoragePermissionsActivity extends AppCompatActivity {

    private String[] permissions;
    private int pCode = 12321;
    public static PermissionListener permissionListener;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        checkPermissions();
    }

    private void checkPermissions() {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {

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

            boolean flag = false;
            for (String s : permissions)
                if (checkSelfPermission(s) != PackageManager.PERMISSION_GRANTED)
                    flag = true;

            if (flag) {
                requestPermissions(permissions, pCode);
            } else {
                permissionListener.permissionResult(true);
                finish();
            }
        }else
            finish();
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        if (requestCode == pCode) {
            boolean flag = true;
            if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M)
                for (int i = 0, len = permissions.length; i < len; i++)
                    if (grantResults[i] != PackageManager.PERMISSION_GRANTED)
                        flag = false;
            if (flag) {
                if (permissionListener != null)
                    permissionListener.permissionResult(true);
            } else if (permissionListener != null)
                permissionListener.permissionResult(false);
            finish();
        }
    }
}

3- permissionListener是一个静态界面,可以在context.startActivity(...)之前直接设置,或者使用您的计划查找权限结果。

public interface PermissionListener extends Serializable {
    void permissionResult(boolean hasPermission);
}

4-最后拨打context.startActivity(new Intent(context, CheckStoragePermissionsActivity.class));

CheckStoragePermissionsActivity执行所有操作并在用户允许或拒绝操作后完成。

答案 3 :(得分:3)

你无法覆盖它。此方法仅适用于活动和碎片。但是,您可以在Location类中创建一个静态方法,并从您的activity / fragment中重写onRequestPermissionResult方法。

我已经为Location定制了一个自定义的实现。您还可以使用名为Let for permissions的库。

答案 4 :(得分:0)

可能您可以创建一个扩展Activity的类(AppCompactActivity更好),实现所有需要的位置代码,并使用该类扩展您需要使用它的所有活动。

答案 5 :(得分:-1)

使用此类:

public class permissionModule {

final public static int STORAGE_PERMISSION_CODE = 23;
private Activity activity;

public permissionModule(Activity activity) {
    this.activity = activity;
}

public void startGetPermission(){
    if (isStorageReadable()){
        Toast.makeText(activity,"you Already have the permission to access storage",Toast.LENGTH_SHORT).show();
    }else {
        requestStoragePermission();
    }
}

private void requestStoragePermission() {
    ActivityCompat.requestPermissions(activity, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, STORAGE_PERMISSION_CODE);
}

private boolean isStorageReadable() {
    int result = ContextCompat.checkSelfPermission(activity, 

Manifest.permission.READ_EXTERNAL_STORAGE);
        return result == PackageManager.PERMISSION_GRANTED;
    }
}

并在您的活动调用中:

new permissionModule(MainActivity.this).startGetPermission();

最后要获得结果,请在您的活动中覆盖它:

@TargetApi(Build.VERSION_CODES.M)
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    if (requestCode == permissionModule.STORAGE_PERMISSION_CODE) {
        if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            Snackbar permissionWarning = Snackbar.make(rootLayout, "tnk", Snackbar.LENGTH_INDEFINITE);
            permissionWarning.setAction("ok", new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    //...
                }
            });
            permissionWarning.show();
        } else {
            boolean showRationale = shouldShowRequestPermissionRationale(Manifest.permission.READ_EXTERNAL_STORAGE);
            if (showRationale) {
                Snackbar permissionWarning = Snackbar.make(rootLayout, "Permission Required to access storage", Snackbar.LENGTH_INDEFINITE);
                permissionWarning.setAction("ok", new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                        //requestStoragePermission();
                    }
                });
                permissionWarning.show();
            } else {
                Snackbar snackbar = Snackbar.make(rootLayout, "you denied the permission for ever pleas fix it in setting", Snackbar.LENGTH_INDEFINITE);
                snackbar.setAction("setting", new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        Intent intent = new Intent();
                        intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
                        Uri uri = Uri.fromParts("package", MainActivity.this.getPackageName(), null);
                        intent.setData(uri);
                        MainActivity.this.startActivity(intent);
                    }
                });
                snackbar.show();
            }
        }
    }
}