java Android M onRequestPermissionsResult in non-Activity
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/38480671/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Android M onRequestPermissionsResult in non-Activity
提问by MD Husnain Tahir
I have an application which needs to find the user location, and location is fetched in various classes, so i have written a separate class(Not an Activity class) that fetches user location using location services, it works fine under Android Mbut requires run time permissions in Android M, i want to check permissions in my Location class and i know how to check them but i cannot use onRequestPermissionsResultmethod in my Location class, because my Location class do not extends from any activity.
我有一个需要查找用户位置的应用程序,位置是在各种类中获取的,所以我编写了一个单独的类(不是 Activity 类),它使用位置服务获取用户位置,它在Android M下运行良好,但需要运行Android M 中的时间权限,我想检查我的 Location 类中的权限,我知道如何检查它们,但我不能在我的 Location 类中使用onRequestPermissionsResult方法,因为我的 Location 类不从任何活动扩展。
So What i should do for achieving this? any help/clue is appreciated Thanks in advance
那么我应该怎么做才能实现这一目标?感谢任何帮助/线索提前致谢
回答by AkshayK
Since public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults)is an abstract method of ActivityCompat.OnRequestPermissionsResultCallbackinterface. See the documentation
由于 public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults)是ActivityCompat.OnRequestPermissionsResultCallback接口的抽象方法。查看 文档
Just implement this interface in the required class and it's done. For example
只需在所需的类中实现此接口即可。例如
class location implements ActivityCompat.OnRequestPermissionsResultCallback{ }
Now just override onRequestPermissionsResult()
现在只需覆盖onRequestPermissionsResult()
@Override
public void onRequestPermissionsResult(int requestCode,
String permissions[], int[] grantResults) {
switch (requestCode) {
// case Statements
}
}
回答by CommonsWare
You are welcome to call checkSelfPermission()
from a non-UI class, as that merely needs some Context
.
欢迎您checkSelfPermission()
从非 UI 类调用,因为它只需要一些Context
.
However, you must call requestPermissions()
on some activity or fragment. You override onRequestPermissionsResult()
on that sameactivity or fragment. This is no different than calling startActivityForResult()
and implementing onActivityResult()
.
但是,您必须调用requestPermissions()
某些活动或片段。您覆盖onRequestPermissionsResult()
对同一活动或片段。这与调用startActivityForResult()
和实现onActivityResult()
.
The idea is that you request the permission before you do anything that involves your non-UI classes that are dealing with locations.
这个想法是在你做任何涉及处理位置的非 UI 类之前请求许可。
回答by Embydextrous
You can not override it. This method is only available for Activity and Fragments. But you can create a static method inside your Location class and call it from your activity/fragment's overridden onRequestPermissionResult method.
你不能覆盖它。此方法仅适用于 Activity 和 Fragments。但是您可以在 Location 类中创建一个静态方法,并从您的活动/片段的重写 onRequestPermissionResult 方法中调用它。
I have made a custom implementation for Location combined with permission. You can also use a library called Let for permissions.
我已经为 Location 结合许可做了一个自定义实现。您还可以使用名为 Let 的库来获取权限。
回答by Misagh
1- create a transparent activity
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- customize your activity
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
is an static interface and can be set directly before context.startActivity(...), or use your plan to found permission result.
3-permissionListener
是一个静态接口,可以直接在context.startActivity(...)之前设置,或者使用你的计划找到权限结果。
public interface PermissionListener extends Serializable {
void permissionResult(boolean hasPermission);
}
4- finally call context.startActivity(new Intent(context, CheckStoragePermissionsActivity.class));
4- 最后打电话 context.startActivity(new Intent(context, CheckStoragePermissionsActivity.class));
CheckStoragePermissionsActivity
do all of needed and finish after user Allow or Deny action.
CheckStoragePermissionsActivity
执行所有需要的操作并在用户允许或拒绝操作后完成。
回答by user3132789
probably you can create a class that extends Activity (AppCompactActivity is better), implement all needed location code and extends with this class all activities where you need to use it.
也许您可以创建一个扩展 Activity 的类(AppCompactActivity 更好),实现所有需要的位置代码并使用此类扩展您需要使用它的所有活动。
回答by m.sajjad.s
use this class :
使用这个类:
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;
}
}
and in your activity call :
并在您的活动电话中:
new permissionModule(MainActivity.this).startGetPermission();
finally for result , override this in your activity :
最后为了结果,在您的活动中覆盖它:
@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();
}
}
}
}