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)
欢迎您checkSelfPermission()
从非UI类调用,因为它只需要一些Context
.
但是,您必须调用requestPermissions()
某些活动或片段.您覆盖onRequestPermissionsResult()
对同一活动或片段.这与调用startActivityForResult()
和实现没什么不同onActivityResult()
.
我们的想法是,在您执行涉及处理位置的非UI类的任何操作之前,请求您的许可.
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
执行所有需要的操作,并在用户允许或拒绝操作后完成。
归档时间: |
|
查看次数: |
16583 次 |
最近记录: |