非活动中的Android M onRequestPermissionsResult

MD *_*hir 21 java android android-6.0-marshmallow

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

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

小智 15

由于 public void onRequestPermissionsResult(int requestCode,String permissions [],int [] grantResults)ActivityCompat.OnRequestPermissionsResultCallback接口的抽象方法.请参阅 文档

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

class location implements  ActivityCompat.OnRequestPermissionsResultCallback{ }
Run Code Online (Sandbox Code Playgroud)

现在只需覆盖onRequestPermissionsResult()

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

  • 理论上是的,但是android似乎并没有在非活动类上调用onRequestPermissionsResult. (9认同)
  • 好吧,这不可能是真的,因为 `requestPermissions()` 需要 `Activity` 作为参数,而不仅仅是实现 `OnRequestPermissionsResultCallback` 的类 (2认同)
  • 我这样做了但它不起作用所以这个答案没用 (2认同)
  • 当方法(A)调用接口(B)回调(C)时,如果A有一个参数引用B,那么回调C将被调用,否则C无法被调用。对于 requestPermissions() 方法,它使用 Activity 作为参数,而不是 ActivityCompat.OnRequestPermissionsResultCallback,因此根本不可能使用它 (2认同)

Com*_*are 7

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

但是,您必须调用requestPermissions()某些活动或片段.您覆盖onRequestPermissionsResult()同一活动或片段.这与调用startActivityForResult()和实现没什么不同onActivityResult().

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


Mis*_*agh 5

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>
Run Code Online (Sandbox Code Playgroud)

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();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

public interface PermissionListener extends Serializable {
    void permissionResult(boolean hasPermission);
}
Run Code Online (Sandbox Code Playgroud)

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

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