Проблема заключается в типах используемого монитора, монитора 4k и стандартного монитора. Chrome на сегодняшний день является самым умным, когда мы можем рассказать нам, что такое уровень масштабирования, используя window.devicePixelRatio
, по-видимому, он может определить, что такое плотность пикселей и сообщает о том же номере, что важно.
Другие браузеры, не так много. IE и Edge, вероятно, являются самыми худшими, поскольку они значительно изменяют уровни масштабирования. Чтобы получить текст такого же размера на мониторе 4k, вам нужно выбрать 200% вместо 100% на стандартном мониторе.
По состоянию на май 2018 года, вот что мне нужно для определения уровней масштабирования для нескольких наиболее популярных браузеров, Chrome, Firefox и IE11. Я рассказываю, какой процент масштабирования. Для IE он сообщает 100% даже для 4k мониторов, которые на самом деле составляют 200%, но размер текста на самом деле тот же.
Вот скрипка: https://jsfiddle.net/ae1hdogr /
Если кто-то захочет взять удар в других браузерах и обновить скрипку, тогда, пожалуйста, сделайте это. Моя основная цель заключалась в том, чтобы охватить эти три браузера, чтобы определить, используют ли люди коэффициент масштабирования более 100% для использования моего веб-приложения и отображают уведомление о том, что коэффициент масштабирования арендодателя.
Измените свойство разрешений в вашем /system/etc/permission/platform.xml
, и группа должна указывать, как показано ниже.
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE">
<group android:gid="sdcard_rw" />
<group android:gid="media_rw" />
</uses-permission>
В дополнение ко всем ответам, если клиенты используют Android 6.0, Android добавила новую модель разрешения для (Marshmallow).
Trick: Если вы настроили таргетинг на версию 22 или ниже, ваше приложение будет запрашивать все разрешения во время установки так же, как и на любом устройстве под управлением ОС под Marshmallow. Если вы пытаетесь на эмуляторе, а затем с android 6.0 вперед, вам нужно явно указать настройки -> apps-> YOURAPP -> и изменить разрешение, если вы дали какой-либо.
Я испытываю то же самое. Я обнаружил, что если вы перейдете в «Настройки» -> «Диспетчер приложений» - «Приложение» -> «Разрешения» -> «Включить хранилище», он решает проблему.
Странно после того, как поместил косую черту «/» перед моей новой версией, моя проблема была решена. Я изменил это:
File myFile= new File(Environment.getExternalStorageDirectory() + "newFile");
на следующее:
File myFile= new File(Environment.getExternalStorageDirectory() + "/newFile");
Добавить зависимости градиента
implementation 'com.karumi:dexter:4.2.0'
Добавьте в свой основной код код.
import com.karumi.dexter.Dexter;
import com.karumi.dexter.MultiplePermissionsReport;
import com.karumi.dexter.PermissionToken;
import com.karumi.dexter.listener.PermissionRequest;
import com.karumi.dexter.listener.multi.MultiplePermissionsListener;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_splash);
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
checkMermission();
}
}, 4000);
}
private void checkMermission(){
Dexter.withActivity(this)
.withPermissions(
android.Manifest.permission.READ_EXTERNAL_STORAGE,
android.Manifest.permission.WRITE_EXTERNAL_STORAGE,
android.Manifest.permission.ACCESS_NETWORK_STATE,
Manifest.permission.INTERNET
).withListener(new MultiplePermissionsListener() {
@Override
public void onPermissionsChecked(MultiplePermissionsReport report) {
if (report.isAnyPermissionPermanentlyDenied()){
checkMermission();
} else if (report.areAllPermissionsGranted()){
// copy some things
} else {
checkMermission();
}
}
@Override
public void onPermissionRationaleShouldBeShown(List<PermissionRequest> permissions, PermissionToken token) {
token.continuePermissionRequest();
}
}).check();
}
Добавить разрешение в манифест.
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_INTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
Возможно, ответ таков:
на устройствах API> = 23, если вы устанавливаете приложение (приложение не является системным приложением), вы должны проверить разрешение на хранение в «Настройках - приложениях», есть список разрешений для каждого приложения, вы должны его проверить! попробуйте
Я создаю папку под / data / в моем init.rc (сбрасывая с помощью aosp на Nexus 7) и имел именно эту проблему.
Оказалось, что предоставление папки rw (666) ) было недостаточно, и это должно было быть rwx (777), тогда все это сработало!
Я ожидал бы, что все ниже /data
будут принадлежать «внутреннему хранилищу». Однако вы должны написать /sdcard
.
Когда ваше приложение принадлежит системному приложению, оно не может получить доступ к SD-карте.
Моя проблема была в «TargetApi (23)», которая необходима, если ваш minSdkVersion приведен ниже 23.
Итак, у меня есть разрешение на запрос со следующим фрагментом
protected boolean shouldAskPermissions() {
return (Build.VERSION.SDK_INT > Build.VERSION_CODES.LOLLIPOP_MR1);
}
@TargetApi(23)
protected void askPermissions() {
String[] permissions = {
"android.permission.READ_EXTERNAL_STORAGE",
"android.permission.WRITE_EXTERNAL_STORAGE"
};
int requestCode = 200;
requestPermissions(permissions, requestCode);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// ...
if (shouldAskPermissions()) {
askPermissions();
}
}
Для API 23+ вам необходимо запросить разрешения на чтение и запись, даже если они уже находятся в вашем манифесте.
// Storage Permissions
private static final int REQUEST_EXTERNAL_STORAGE = 1;
private static String[] PERMISSIONS_STORAGE = {
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE
};
/**
* Checks if the app has permission to write to device storage
*
* If the app does not has permission then the user will be prompted to grant permissions
*
* @param activity
*/
public static void verifyStoragePermissions(Activity activity) {
// Check if we have write permission
int permission = ActivityCompat.checkSelfPermission(activity, Manifest.permission.WRITE_EXTERNAL_STORAGE);
if (permission != PackageManager.PERMISSION_GRANTED) {
// We don't have permission so prompt the user
ActivityCompat.requestPermissions(
activity,
PERMISSIONS_STORAGE,
REQUEST_EXTERNAL_STORAGE
);
}
}
AndroidManifest.xml
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
Для официальных документацию о запросах разрешений для API 23+, проверьте https://developer.android.com/training/permissions/requesting.html
У меня была такая же ошибка при попытке записать изображение в папке DCIM / camera на Galaxy S5 (android 6.0.1), и я понял, что только эта папка ограничена. Я просто мог писать в DCIM / любую папку, но не в камеру. Это должно быть ограничение / настройка на основе бренда.
после добавления разрешения решила мою проблему
<uses-permission android:name="android.permission.INTERNET"/>
Применять разрешения хранилища post 6.0 можно обойти, если у вас есть корневое устройство через эти команды adb:
root@msm8996:/ # getenforce
getenforce
Enforcing
root@msm8996:/ # setenforce 0
setenforce 0
root@msm8996:/ # getenforce
getenforce
Permissive
Основываясь на ответе user462990
Чтобы получать уведомление, когда пользователь отвечает на диалог запроса разрешения, используйте это: (код в kotlin)
override fun onRequestPermissionsResult(requestCode: Int,
permissions: Array<String>, grantResults: IntArray) {
when (requestCode) {
MY_PERMISSIONS_REQUEST_READ_CONTACTS -> {
// If request is cancelled, the result arrays are empty.
if ((grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED)) {
// permission was granted, yay! Do the
// contacts-related task you need to do.
} else {
// permission denied, boo! Disable the
// functionality that depends on this permission.
}
return
}
// Add other 'when' lines to check for other
// permissions this app might request.
else -> {
// Ignore all other requests.
}
}
}
В моем случае я использовал библиотеку выбора файлов , которая вернула путь к внешнему хранилищу, но началась с /root/
. И даже с разрешением WRITE_EXTERNAL_STORAGE , предоставленным во время выполнения, я все еще получил ошибку EACCES (Permission denied). Поэтому используйте Environment.getExternalStorageDirectory()
, чтобы получить правильный путь к внешнему хранилищу.
Пример: Невозможно записать: /root/storage/emulated/0/newfile.txt
Можно написать: /storage/emulated/0/newfile.txt
boolean externalStorageWritable = isExternalStorageWritable();
File file = new File(filePath);
boolean canWrite = file.canWrite();
boolean isFile = file.isFile();
long usableSpace = file.getUsableSpace();
Log.d(TAG, "externalStorageWritable: " + externalStorageWritable);
Log.d(TAG, "filePath: " + filePath);
Log.d(TAG, "canWrite: " + canWrite);
Log.d(TAG, "isFile: " + isFile);
Log.d(TAG, "usableSpace: " + usableSpace);
/* Checks if external storage is available for read and write */
public boolean isExternalStorageWritable() {
String state = Environment.getExternalStorageState();
if (Environment.MEDIA_MOUNTED.equals(state)) {
return true;
}
return false;
}
Выход 1:
externalStorageWritable: true
filePath: /root/storage/emulated/0/newfile.txt
isFile: false
usableSpace: 0
Выход 2:
externalStorageWritable: true
filePath: /storage/emulated/0/newfile.txt
isFile: true
usableSpace: 1331007488
root
с пути разрешило мою проблему.
– avidProgrammer
30 November 2017 в 17:29
У меня была та же проблема на Samsung Galaxy Note 3, на которой запущен CM 12.1. Проблема для меня заключалась в том, что у меня был
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"
android:maxSdkVersion="18"/>
, и мне пришлось использовать его для хранения и хранения фотографий пользователей. Когда я попытался загрузить те же фотографии в ImageLoader, я получил ошибку (Permission denied)
. Решение заключалось в том, чтобы явно добавить
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
, поскольку указанное выше разрешение ограничивает только разрешение на запись до версии API версии 18 и с ним разрешение на чтение.