0

私のテスト用デバイスには Android N Developer プレビュー バージョンがあり、アプリの起動時にランタイム許可を求めています。

残念ながら、アプリは権限を付与するための警告ダイアログを表示しません。以下のコードを使用しています。

ランチャー アクティビティ

public class LoginActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);

        if(checkPermissions()) {
            renderView();
        }
    }

    private boolean checkPermissions() {

        int permissionWriteStorage = ContextCompat.checkSelfPermission(this, Manifest.permission_group.STORAGE);
        int permissionPhoneState = ContextCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_STATE);

        Log.i("permission",(permissionWriteStorage == PackageManager.PERMISSION_GRANTED) + "");
        //This prints false

        List<String> listPermissionsNeeded = new ArrayList<>();
        if (permissionWriteStorage != PackageManager.PERMISSION_GRANTED) {
            listPermissionsNeeded.add(Manifest.permission_group.STORAGE);
        }
        if (permissionPhoneState != PackageManager.PERMISSION_GRANTED) {
            listPermissionsNeeded.add(Manifest.permission.READ_PHONE_STATE);
        }

        if (!listPermissionsNeeded.isEmpty()) {
            Log.i("permission", "in if");
            //I get this in the logs

            ActivityCompat.requestPermissions(this, listPermissionsNeeded.toArray(new String[listPermissionsNeeded.size()]),REQUEST_ID_MULTIPLE_PERMISSIONS);
            return false;
        }
        return true;
    }
}

build.gradle

apply plugin: 'com.android.application'
apply plugin: 'com.google.gms.google-services'

android {
    compileSdkVersion 24
    buildToolsVersion "23.0.3"

    defaultConfig {
        applicationId 'com.***.***'
        minSdkVersion 16
        targetSdkVersion 24
    }
}

編集:解決策(1/2)

ビルド ツールのバージョンを24.0.1I am gets the alert for READ_PHONE_STATEpermission but not for the permission group に変更すると、 STORAGE. パーミッション グループのパーミッションごとに個別に要求する必要がありますか?

編集 2: ソリューション (2/2)

に置き換えることで解決できましManifest.permission_group.STORAGEManifest.permission.WRITE_EXTERNAL_STORAGE。ドキュメントによると、グループ全体に対する 1 つの危険なアクセス許可の確認が必要なだけです。

ユーザーは、権限グループごとに 1 回だけ権限を付与する必要があります。アプリがそのグループ (アプリ マニフェストにリストされているもの) の他のパーミッションを要求すると、システムはそれらを自動的に付与します。

4

5 に答える 5

1

よくわかりませんが、ビルドツールのバージョンを変更しました

android {
compileSdkVersion 24
buildToolsVersion "24.0.0"

defaultConfig {
    applicationId 'com.***.***'
    minSdkVersion 16
    targetSdkVersion 24
}
于 2016-07-27T09:09:17.753 に答える
0

ContextCompat の代わりに User ActivityCompat

int permissionWriteStorage = ActivityCompat.checkSelfPermission(this, Manifest.permission_group.STORAGE);
int permissionPhoneState = ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_STATE);
于 2016-07-27T09:08:25.230 に答える
0

このテクニックが面倒なのはわかっていますが、単純に使用しないのはなぜですか?

複数の権限も取得できます。

void getPermission(){
    if (ActivityCompat.checkSelfPermission(this, android.Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, android.Manifest.permission_group.STORAGE) != PackageManager.PERMISSION_GRANTED) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M)
            ActivityCompat.requestPermissions(Final_maps.this,
                    new String[]{android.Manifest.permission_group.STORAGE, android.Manifest.permission.READ_PHONE_STATE},
                    CODE);

    }

}

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    switch (requestCode) {
        case CODE:
            if (grantResults.length > 0
                    && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                setLocationEnabled();
                Toast.makeText(this, "Permission Granted!", Toast.LENGTH_SHORT).show();
            } else {
                Toast.makeText(this, "Permission Denied!", Toast.LENGTH_SHORT).show();
                finish();
            }
    }
}
于 2016-07-27T09:11:46.673 に答える