私はAppCompatActivity
のアクティビティを持っています。このアクティビティを実行するには、アプリにACCESS_COARSE_LOCATION
とWRITE_EXTERNAL_STORAGE
権限を許可する必要があります。 Android Studio 3.0にアップデートするまで、すべてうまくいきました。requestPermissionsのプロンプトが表示されない
さて、WRITE_EXTERNAL_STORAGE
許可を要求するためのプロンプトが表示されていない、と機能
public void onRequestPermissionsResult(int requestCode,
String permissions[], int[] grantResults)
が戻っている-1 grantResultsでさえも尋ねず。
許可が必要な場合はACCESS_COARSE_LOCATION
というアクセス許可を要求すると、この現象は起こりません。以下は、両方のチェックを呼び出すコード:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (this.checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
final AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("This app needs location access");
builder.setMessage("Please grant location access so this app can detect beacons.");
builder.setPositiveButton(android.R.string.ok, null);
builder.setOnDismissListener(new DialogInterface.OnDismissListener() {
public void onDismiss(DialogInterface dialog) {
requestPermissions(new String[]{Manifest.permission.ACCESS_COARSE_LOCATION}, PERMISSION_REQUEST_COARSE_LOCATION);
}
});
builder.show();
}
}
そして、他:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
final int PERMISSION_REQUEST_COARSE_LOCATION = 1;
if (this.checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
final AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("This app needs sd access");
builder.setMessage("Please grant sd access so this app can save files.");
builder.setPositiveButton(android.R.string.ok, null);
builder.setOnDismissListener(new DialogInterface.OnDismissListener() {
public void onDismiss(DialogInterface dialog) {
requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, PERMISSION_REQUEST_WRITE_EXTERNAL_STORAGE);
}
});
builder.show();
}
}
が私のマニフェストに対応するセクションは次のようになります。
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
私は多くのことを読みました、しかし、これは非常に奇妙なものです。何らかのタイプのパーミッションがリクエストダイアログを表示していて、他のものはそうではありません。 ところで、デバイスにはSDカードがありません(常に内部ストレージを使用しています)が、これは問題ではありませんでした。
どちらも私のtargetSdkVersion
とcompileSdkVersion
も正常に動作している26
EDIT
他の関連する権限などREAD_EXTERNAL_STORAGE
、です。これは単なる書き込み許可の問題です。事前に
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_device_discovery);
context = this;
wm = (WifiManager) context.getApplicationContext().getSystemService(WIFI_SERVICE);
intent = getIntent();
if(intent.getBooleanExtra("LOCAL_NETWORK", true) == true){
ipAddress = Formatter.formatIpAddress(wm.getConnectionInfo().getIpAddress());
port = DEFAULT_LIGHT_PORT;
}
else{
ipAddress = intent.getStringExtra("TRACK_IP");
port = intent.getIntExtra("TRACK_PORT", DEFAULT_GATEWAY_PORT);
}
font = Typeface.createFromAsset(MainActivity.mainActivity.getAssets(), "RepRg.ttf");
mHandler = new Handler();
deviceArrayList = new ArrayList<>();
devicesBufferList = new ArrayList<>();
lightListAdapter = new LightListAdapter(this, deviceArrayList, intent);
discoveredListView = (ListView) findViewById(R.id.paired_devices);
discoveredListView.setAdapter(lightListAdapter);
listAllCheckBox = (CheckBox) findViewById(R.id.listAllCheckBox);
refreshButton = (ImageButton) findViewById(R.id.refreshButton);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (this.checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
final AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("This app needs sd access");
builder.setMessage("Please grant sd access so this app can save files.");
builder.setPositiveButton(android.R.string.ok, null);
builder.setOnDismissListener(new DialogInterface.OnDismissListener() {
public void onDismiss(DialogInterface dialog) {
requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, PERMISSION_REQUEST_WRITE_EXTERNAL_STORAGE);
}
});
builder.show();
}
}
listAllCheckBox.setTypeface(font);
listAllCheckBox.setTextSize(18);
listAllCheckBox.setTextColor(Color.parseColor("#202020"));
listAllCheckBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
lightListAdapter.clear();
processDeviceListing();
}
});
refreshButton.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
refreshButton.setImageResource(R.drawable.refresh_down);
break;
case MotionEvent.ACTION_UP:
refreshButton.setImageResource(R.drawable.refresh_up);
refreshDevicesList();
break;
case MotionEvent.ACTION_CANCEL:
refreshButton.setImageResource(R.drawable.refresh_up);
break;
}
return false;
}
});
}
ありがとう: は2つのAndroidデバイスやエミュレータ
コンプリートのonCreateメソッドでテスト。
のために有用であると思います。問題は、ACCESS_COARSE_LOCATIONを要求するときに許可要求のプロンプトが表示されているが、WRITE_EXTERNAL_STORAGEを要求しているときは表示されないということです。あなたと私のコードの両方で起こっていること。私は掲示する前にドキュメントを読むだろう;) – gotramaval
私の更新された答えを確認してください – diegoveloper
それはコピー貼り付けの問題、申し訳ありませんでした。私はそれを変更しましたが、まだ問題を解決していません – gotramaval