2016-10-25 22 views
1

AndroidアプリケーションでREAD_EXTERNAL_STORAGEへのアクセス許可をリクエストしようとしています。私の問題は、ダイアログが表示されないので、 "onRequestPermissionsResult"も決して呼び出されないということです。私がここで間違っていることは何ですか?私は、このリンクをたどっ:ここDeveloper Android許可ダイアログが表示されない

は私のコードです:

public class AccountActivity extends AppCompatActivity { 

    protected TextView changeProfileImgBtn; 
    private static final int SELECTED_PICTURE = 1; 
    private static final int F = 101; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_account); 

     changeProfileImgBtn = (TextView) findViewById(R.id.accountChangeProfileImgBtn); 

     changeProfileImgBtn.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 

       if (ContextCompat.checkSelfPermission(AccountActivity.this, 
         Manifest.permission.READ_EXTERNAL_STORAGE) 
         != PackageManager.PERMISSION_GRANTED) { 

        if (ActivityCompat.shouldShowRequestPermissionRationale(AccountActivity.this, 
           Manifest.permission.READ_EXTERNAL_STORAGE)) { 
         System.out.println("shouldShowRequestPermissionRationale"); 

        } else { 
         ActivityCompat.requestPermissions(AccountActivity.this, 
           new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, 
           F); 

         System.out.println("REQUEST"); 

        } 
       } else { 
        Intent i = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI); 
        startActivityForResult(i, SELECTED_PICTURE); 
       } 
      } 
     }); 
    } 

    @Override 
    public void onRequestPermissionsResult(int requestCode, 
              @NonNull String permissions[], @NonNull int[] grantResults) { 

     System.out.println("onRequestPermissionsResult"); 
     switch (requestCode) { 
      case F: { 
       if (grantResults.length > 0 
         && grantResults[0] == PackageManager.PERMISSION_GRANTED) { 

        System.out.println("GRANTED"); 

        Intent i = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI); 
        startActivityForResult(i, SELECTED_PICTURE); 

       } else { 
        System.out.println("DENIED"); 
       } 
       return; 
      } 

      // other 'case' lines to check for other 
      // permissions this app might request 
     } 
    } 
} 

あなたはログインActivityCompat.requestPermissions(...)で見ることができるように「REQUEST」が印刷されたと呼ばれています。 "shouldShowRequestPermissionRationale"は、実行中のデバイスに関係なく、決して印刷されません。 "onRequestPermissionsResult"も出力されません。

D/ViewRootImpl: ViewPostImeInputStage processPointer 0 
D/ViewRootImpl: ViewPostImeInputStage processPointer 1 
I/System.out: REQUEST 
I/Timeline: Timeline: Activity_idle id: [email protected] time:106175669 

私は私のマニフェストファイルでこれを含まれている:

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> 
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 

は非常に任意のヘルプを鑑賞。

+1

:あなたはおそらく私自身のいずれかのように、いくつかのサードパーティのヘルパーコードを使用することができ、より簡単にするために

if (ActivityCompat.shouldShowRequestPermissionRationale(AccountActivity.this, Manifest.permission.READ_EXTERNAL_STORAGE)) { ActivityCompat.requestPermissions(AccountActivity.this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, F); } 

''要素は間違った場所にあります(https://commonsware.com/blog/2015/08/31/hey-where-did-my-permission-go.html)。 – CommonsWare

+0

これは、マニフェストタグの内側とアプリケーションタグの外側に配置されています。 –

+0

graddのtarget sdkは何ですか? – Sanjeet

答えて

0

更新:マニフェストで許可が要求されていますか?マニフェストにある権限のみを要求できます。ここ

ドキュメント:https://developer.android.com/guide/topics/manifest/manifest-intro.html

+0

はい、マニフェストファイルにを追加しました。今すぐ私のポストにアップロードしました:) –

+0

奇妙なことに、アンインストールと再インストールをお勧めします。 –

+0

もう1つ試してみると、追加されます。 読み込み容量をリクエストしているにもかかわらず、Androidのいくつかのバージョンにはその開封に関連する問題があるようです。 –

0

すべて許可するための共通のクラスを使用して、このクラスを使用します。

public class Utility1 { 


public static class Utility { 
    public static final int MY_PERMISSIONS_REQUEST_READ_EXTERNAL_STORAGE = 123; 
    @TargetApi(Build.VERSION_CODES.JELLY_BEAN) 
    public static boolean checkPermission(final Context context) 
    { 
     int currentAPIVersion = Build.VERSION.SDK_INT; 
     if(currentAPIVersion>=android.os.Build.VERSION_CODES.M) 
     { 
      if (ContextCompat.checkSelfPermission(context, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { 
       if (ActivityCompat.shouldShowRequestPermissionRationale((Activity) context, Manifest.permission.READ_EXTERNAL_STORAGE)) { 
        AlertDialog.Builder alertBuilder = new AlertDialog.Builder(context); 
        alertBuilder.setCancelable(true); 
        alertBuilder.setTitle("Permission necessary"); 
        alertBuilder.setMessage("External storage permission is necessary"); 
        alertBuilder.setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() { 
         @TargetApi(Build.VERSION_CODES.JELLY_BEAN) 
         public void onClick(DialogInterface dialog, int which) { 
          ActivityCompat.requestPermissions((Activity) context, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, MY_PERMISSIONS_REQUEST_READ_EXTERNAL_STORAGE); 
         } 
        }); 
        AlertDialog alert = alertBuilder.create(); 
        alert.show(); 
       } else { 
        ActivityCompat.requestPermissions((Activity) context, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, MY_PERMISSIONS_REQUEST_READ_EXTERNAL_STORAGE); 
       } 
       return false; 
      } else { 
       return true; 
      } 
     } else { 
      return true; 
     } 
    } 
} 

}

あなたが許可をチェックする必要がどこmainclassにこの行を使用します。

boolean result = Utility1.Utility.checkPermission(MainActivity.this); 
+0

私はこれを使用して終了しました。しかし、ユーザーはアプリケーションの許可を受け入れることができないため、デバイスの設定から受け入れる必要があります。 –

+0

ご協力ありがとうございます。 requestPermissions(...)が呼び出されたときにリクエスト権限のダイアログが表示されないことは非常に奇妙です。だから、AlertDialogは今のところ動作しなければならないでしょう。 –

+0

あなたのgradleを共有できますか?なぜなら、Graleターゲットのsdkバージョンでは最大23のAPIなので、この許可が来るからです。 –

0

あなたはmanifest内もののapplicationセクションの外にuses-permissionを持っていることを確認してください。あなたも、あまりにものような根拠のブロックを示すべきであるにもに許可を求めることを試みることができます。おそらく、あなたのPermissionHelper

関連する問題