【发布时间】:2017-10-05 02:31:49
【问题描述】:
我发现了一些涉及此问题的其他主题,但解决方案对我不起作用。
我有一个类PermissionsManager.java,其中包含检查权限的方法,我在MainActivity.java 中调用它。我从一些人那里读到我必须将上下文和活动传递给checkPermissions(),但我尝试了虽然上下文允许我的应用程序在已授予权限的情况下工作,但如果尚未授予权限,应用程序将崩溃。我无法通过合适的 Activity。
我可以将所有代码放在我的 MainActivity 中,并且我知道它可以在那里工作,因为我已经完成了所有工作,但我真的很想以 MVC 模式设置我的代码,以使视图与控制器分开。
我收到以下错误:
java.lang.NullPointerException:尝试调用虚拟方法'int android.content.Context.checkPermission(java.lang.String, int, int)' 在空对象引用上
谁能解释一下如何让它发挥作用?
权限管理器
import android.Manifest;
import android.content.DialogInterface;
import android.content.pm.PackageManager;
import android.os.Build;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import java.util.ArrayList;
import java.util.List;
/**
* Created on 5/6/2017.
*/
public class PermissionsManager extends AppCompatActivity {
final private int REQUEST_CODE_ASK_MULTIPLE_PERMISSIONS = 124;
public void checkPermissions() {
List<String> permissionsNeeded = new ArrayList<String>();
final List<String> permissionsList = new ArrayList<String>();
if (!addPermission(permissionsList, Manifest.permission.READ_CONTACTS))
permissionsNeeded.add("Read Contacts");
if (!addPermission(permissionsList, Manifest.permission.SEND_SMS))
permissionsNeeded.add("Send SMS Texts");
if (!addPermission(permissionsList, Manifest.permission.RECEIVE_SMS))
permissionsNeeded.add("Receive SMS Texts");
if (!addPermission(permissionsList, Manifest.permission.READ_SMS))
permissionsNeeded.add("Read SMS Texts");
if (permissionsList.size() > 0) {
if (permissionsNeeded.size() > 0) {
// Need Rationale
String message = "This app requires the following permissions to function correctly: \n" + permissionsNeeded.get(0);
for (int i = 1; i < permissionsNeeded.size(); i++)
message = message + "\n" + permissionsNeeded.get(i);
showMessageOKCancel(message,
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
requestPermissions(permissionsList.toArray(new String[permissionsList.size()]),
REQUEST_CODE_ASK_MULTIPLE_PERMISSIONS);
}
}
});
return;
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
requestPermissions(permissionsList.toArray(new String[permissionsList.size()]),
REQUEST_CODE_ASK_MULTIPLE_PERMISSIONS);
}
return;
}
}
private void showMessageOKCancel(String message, DialogInterface.OnClickListener okListener) {
new AlertDialog.Builder(this)
.setMessage(message)
.setPositiveButton("OK", okListener)
.setNegativeButton("Cancel", null)
.create()
.show();
}
private boolean addPermission(List<String> permissionsList, String permission) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (checkSelfPermission(permission) != PackageManager.PERMISSION_GRANTED) {
permissionsList.add(permission);
// Check for Rationale Option
if (!shouldShowRequestPermissionRationale(permission))
return false;
}
}
return true;
}
}
MainActivity OnCreate 方法
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
// Check Permissions
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
PermissionsManager permissionsManager = new PermissionsManager();
permissionsManager.checkPermissions();
}
}
我尝试了一些这样的代码,但它对我不起作用。
if(ContextCompat.checkSelfPermission((Activity)mContext,Manifest.permission.REA
D_SMS)!=PackageManager.PERMISSION_GRANTED)
{
ActivityCompat.requestPermissions((Activity) mContext, new String[]{Manifest.permission.READ_SMS},
MY_PERMISSIONS_REQUEST_READ_SMS);
}
【问题讨论】:
标签: java android model-view-controller permissions