2017-05-06 7 views
-1

これに触れたいくつかのトピックが見つかりましたが、解決策は私のためには機能しませんでした。Android - 別のクラスで権限を確認

私はクラスPermissionsManager.javaに許可をチェックする方法が含まれており、MainActivity.javaで電話しています。コンテキストとアクティビティをcheckPermissions()に渡す必要があると私は読んでいますが、アクセス許可がすでに与えられている場合はコンテキストが私のアプリケーションを許可しますが、許可が与えられていないとクラッシュします。適切なアクティビティを通過するのに問題がありました。

私はMainActivityにすべてのコードを入れることができました。私はそれがすべて動作して以来、そこで動作することを知っていますが、MVCパターンで自分のコードを設定して、

私は次のエラーを取得する:

java.lang.NullPointerException: Attempt to invoke virtual method 'int android.content.Context.checkPermission(java.lang.String, int, int)' on a null object reference

誰もがこの作業を取得する方法についていくつかの光を当てますか?

PermissionsManager

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); 
     } 

答えて

1

Could anyone shed some light on how to get this to work?

ステップ#1:決してそれは単に仕事とあなたが持っているもののような例外に結果しないよう、活動を自分のインスタンスを作成します。 PermissionsManager permissionsManager = new PermissionsManager();を取り除く。

ステップ2:MainActivityは、PermissionsManagerから続きます。

I'd really like to set up my code in a MVC pattern to keep Views separate from controllers

MVCとの関係はわかりません。それにもかかわらず、あなたの活動は少なくともあなたの活動がonRequestPermissionsResults()を実装しなければならないので、許可を少なくとも幾分認識していなければなりません。許可ロジックをMainActivity(そしておそらく他のアクティビティ)が継承する基本クラスに移動したいのであれば、それは問題ありません。

the seemingly infinite number of runtime permissions helper librariesをご覧ください。

+0

ありがとうございました。基本クラスのアイデアが働いた。今、私のMainActivityはうんざりしていません。そうです、MVCは正しいアイデアではありませんでした。私は勉強を続けなければならない。 –

+0

こんにちは、@ CommonSWare可能であればこの質問をチェックしてください.. http://stackoverflow.com/questions/42968587/android-email-client-receiver-email-id-empty-in-android-parseありがとう –

関連する問題