我遇到了请求权限背后的手动过程的问题(只是一直陷入'拒绝'代码),所以我切换到使用Dexter来简化.我在onCreate()中实现了以下代码,然后我对应用程序进行了全新安装:
Dexter.withActivity(this)
.withPermission(Manifest.permission.CAMERA)
.withListener(new PermissionListener() {
@Override public void onPermissionGranted(PermissionGrantedResponse response) {
Log.d(TAG, "GRANTED!");
initCamera();
}
@Override public void onPermissionDenied(PermissionDeniedResponse response) {
Log.d(TAG, "DENIED!");
}
@Override public void onPermissionRationaleShouldBeShown(PermissionRequest permission, PermissionToken token) {
Log.d(TAG, "PERMISSION RATIONAL SHOULD BE SHOWN!");
}
}).check();
Run Code Online (Sandbox Code Playgroud)
它立即陷入"拒绝!" 记录,它甚至从未提示过我.我尝试了这个特定的代码来尝试多个权限(这最终是我需要做的):
Dexter.withActivity(activity)
.withPermissions(Manifest.permission.CAMERA,
Manifest.permission.RECORD_AUDIO,
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE)
.withListener(new MultiplePermissionsListener() {
@Override
public void onPermissionsChecked(MultiplePermissionsReport report) {
Log.d(TAG, "Accepted: " + report.getGrantedPermissionResponses().size() + " | Denied: " + report.getDeniedPermissionResponses().get(0).getPermissionName());
}
@Override
public void onPermissionRationaleShouldBeShown(List<PermissionRequest> permissions, PermissionToken token) {
Log.d(TAG, "continuing …Run Code Online (Sandbox Code Playgroud) 我正在开发一个照片编辑器应用程序,在编辑我的图片后,我将它保存到我的本地存储中。它在 android 9 之前工作正常,但在 android 10 上没有。它在 Android 10 中显示“未找到此类文件或目录”的异常。经过一些研究,我发现 getExternalFilesDir() 在 android Q+ 中已弃用。但是我在 android 10 中找不到任何正确的方法来做到这一点。所以如果有人可以提供教程,那将非常有帮助。
我已经添加并授予了使用权限 android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 以防它是问题,但它没有解决任何问题。
这是我的尝试(使用 ParcelFileDescriptor):
private void fileAccessForAndroidQ(Uri fileUri){
try {
ParcelFileDescriptor parcelFileDescriptor = this.getContentResolver().openFileDescriptor(fileUri, "r", null);
InputStream inputStream = new FileInputStream(parcelFileDescriptor.getFileDescriptor());
Cursor returnCursor =
getContentResolver().query(fileUri, null, null, null, null);
int nameIndex = returnCursor.getColumnIndex(OpenableColumns.DISPLAY_NAME);
returnCursor.moveToFirst();
fileName = returnCursor.getString(nameIndex);
file = new File(this.getFilesDir(), fileName);
OutputStream outputStream = new FileOutputStream(file);
IOUtils.copyStream(inputStream, outputStream);
}catch (Exception e){
Toast.makeText(this, ""+e.getMessage(), Toast.LENGTH_SHORT).show();
}
}
Run Code Online (Sandbox Code Playgroud)
任何形式的帮助将不胜感激。
android file fileoutputstream android-external-storage android-10.0
在 API 33 (Android 13) 中,引入了细粒度的媒体权限,开发人员必须请求这些细粒度的权限,而不是READ_EXTERNAL_STORAGE.
READ_MEDIA_AUDIO就是这样一种细粒度的权限。此权限仅存在于 API 级别 33+ 中,所以我的问题是,我应该在清单中请求哪个权限?
由于我的应用程序有minSDK = 21,我是否应该在清单中同时请求READ_EXTERNAL_STORAGE和。READ_MEDIA_AUDIO或者我应该只提出请求READ_EXTERNAL_STORAGE并且这将涵盖READ_MEDIA_AUDIO?(当然,在运行时,我会根据SDK_INT设备请求任一权限。)
我已经尝试了大多数问题的结果,但没有一个对我有用。我尝试使用 PermissionAndroid.request 方法访问 WRITE_EXTERNAL_STORAGE 权限,但它总是返回 never_ask_again 作为结果。
我的请求文件:
try {
const granted = await PermissionsAndroid.request(
PermissionsAndroid.PERMISSIONS.WRITE_EXTERNAL_STORAGE,
{
title: 'External Storage Write Permission',
message: 'App needs write permission',
},
);
console.log(granted);
if (granted === PermissionsAndroid.RESULTS.GRANTED) {
// Start downloading
downloadFile();
console.log('Storage Permission Granted.');
} else {
// If permission denied then show alert
Alert.alert('Error', 'Storage Permission Not Granted');
}
} catch (err) {
// To handle permission related exception
console.log('++++' + err);
}
}
Run Code Online (Sandbox Code Playgroud)
这是我的 AndroidManifest.xml 文件
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<uses-permission android:name="android.permission.INTERNET" …Run Code Online (Sandbox Code Playgroud) android android-external-storage react-native react-native-permissions
我在控制台崩溃和anrs中出错了.有时会出现此错误,我无法找到问题所在.
java.lang.NullPointerException
at java.io.File.fixSlashes(File.java:185)
at java.io.File.<init>(File.java:134)
Run Code Online (Sandbox Code Playgroud)
保存图片的功能代码是:
public static String sharePhoto(Context context, Bitmap bmp) {
File folder = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/Pictures/Folder");
boolean success = true;
String file_path = null;
if (!folder.exists()) {
success = folder.mkdir();
}
if (success) {
file_path = folder + "/Img_" + System.currentTimeMillis() / 1000 + ".jpg";
}
OutputStream os = null;
try {
os = new FileOutputStream(file_path);
bmp.compress(Bitmap.CompressFormat.JPEG, 100, os);
} catch (IOException e) {
e.printStackTrace();
}
} else {
// Do something else on …Run Code Online (Sandbox Code Playgroud) 我正在开发一个需要访问外部存储的自定义复合视图.如何在不涉及外部各方(即活动或片段)的情况下实施权限处理?
我知道我可以使用View的上下文请求权限,但是我如何处理onRequestPermissionsResult()View内部?它甚至可能吗?
如果不可能,处理这样的事情最优雅的解决方案是什么?
android android-custom-view android-permissions android-external-storage android-6.0-marshmallow
更新:我最初的问题可能具有误导性,所以我想重新表述它:我想通过 Android 的存储访问框架从 MTP 连接的设备遍历层次树。我似乎无法实现这一点,因为我得到一个SecurityException声明,即子节点不是其父节点的后代。有没有办法解决这个问题?或者这是一个已知问题?谢谢。
我正在编写一个 Android 应用程序,该应用程序尝试使用 Android 的存储访问框架 (SAF) 通过MtpDocumentsProvider. 我或多或少遵循https://github.com/googlesamples/android-DirectorySelection 中描述的代码示例,了解如何从我的应用程序启动 SAF Picker,选择 MTP 数据源,然后在onActivityResult中使用返回Uri的遍历层次结构。不幸的是,这似乎不起作用,因为一旦我访问一个子文件夹并尝试遍历它,我总是得到一个SecurityException说明document xx is not a descendant of yy
所以我的问题是,使用MtpDocumentProvider,如何从我的应用程序成功遍历层次结构树并避免此异常?
具体来说,在我的应用程序中,我首先调用以下方法来启动 SAF Picker:
private void launchStoragePicker() {
Intent browseIntent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE);
browseIntent.addFlags(
Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION
| Intent.FLAG_GRANT_PREFIX_URI_PERMISSION
| Intent.FLAG_GRANT_READ_URI_PERMISSION
| Intent.FLAG_GRANT_WRITE_URI_PERMISSION
);
startActivityForResult(browseIntent, REQUEST_CODE_OPEN_DIRECTORY);
}
Run Code Online (Sandbox Code Playgroud)
然后 Android SAF 选择器启动,我看到我连接的设备被识别为 MTP 数据源。我选择了上述数据源,然后Uri从我的onActivityResult:
@Override
public void onActivityResult(int requestCode, …Run Code Online (Sandbox Code Playgroud) android mtp android-external-storage storage-access-framework document-provider
要录制SurfeceView我使用的 3rd-party library,该库需要一个路径,其中保存在我的案例中的输出(录制的视频)是savedVideoPath:
mRenderPipeline = EZFilter.input(this.effectBmp)
.addFilter(new Effects().getEffect(VideoMaker.this, i))
.enableRecord(savedVideoPath, true, false)
.into(mRenderView);
Run Code Online (Sandbox Code Playgroud)
录制停止后,视频应该以savedVideoPath为路径保存,当我测试代码时,也就是说,当我打开图库应用程序时,我在那里看到保存的视频,但是当我在Android Q上测试时,我什么也看不见。
由于getExternalStoragePublicDirectory和getExternalStorageDirectory已弃用,我尝试使用getExternalFilesDir如下:
private void getPath() {
String videoFileName = "video_" + System.currentTimeMillis() + ".mp4";
fileName = videoFileName;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
File imageFile = null;
File storageDir = new File(getExternalFilesDir(Environment.DIRECTORY_MOVIES), "Folder");
source = storageDir;
boolean success = true;
if (!storageDir.exists()) {
success = storageDir.mkdirs();
}
if (success) {
imageFile = new File(storageDir, …Run Code Online (Sandbox Code Playgroud) java android android-mediascanner android-external-storage android-10.0
我使用 DownloadManager 下载照片并将其保存到外部图片目录:
.setDestinationInExternalPublicDir(Environment.DIRECTORY_PICTURES, File.separator + filename)
Run Code Online (Sandbox Code Playgroud)
Marshmallow 需要 WRITE_EXTERNAL_STORAGE(如预期),但在 Android Q 及更高版本上,它无需许可即可正常工作。为什么会这样?是因为范围存储吗?
android android-permissions android-download-manager android-external-storage scoped-storage
由于某种原因,我真的很挣扎,希望有人能帮助我指明正确的方向。
我的目标是 Android 11 / API 30,这似乎是所有问题的根源。降低目标可能对我有用——但谷歌似乎最终会迫使我走上这条路,所以我不妨弄清楚这一点。
我的应用程序通常会按照标准写入文件
getExternalFilesDir(null)
Run Code Online (Sandbox Code Playgroud)
这给了我设备上的一条路径
/storage/emulated/0/Android/data/com.domain.testapp/files
Run Code Online (Sandbox Code Playgroud)
我还尝试了其他类型,例如:
getExternalFilesDir(Environment.DIRECTORY_PICTURES)
Run Code Online (Sandbox Code Playgroud)
结果是
/storage/emulated/0/Android/data/com.domain.testapp/files/Documents
Run Code Online (Sandbox Code Playgroud)
我的应用程序实际上将文件写入此位置没有任何问题。在 Android 11 中,我必须使用本地文件浏览器跳过一些麻烦才能查看这些文件 - 但它们确实存在于设备上。
我现在试图为用户提供一些查看文件和共享文件的能力,这就是我所困惑的地方!
下面的代码导致找不到文件
File filePath = this.getExternalFilesDir(null);
String filePathString = filePath.toString();
ArrayList<String> myData = new ArrayList<>();
File fileDir = new File(filePathString);
String[] files = fileDir.list();
if(files.length == 0){
Log.w(APPID, "NO FILES IN FOLDER");
}
Run Code Online (Sandbox Code Playgroud)
是的 - 我知道不需要 File 和 .toString() - 但我每一步都将它们注销,因为我认为我疯了。
我知道这个应用程序指向的文件夹中有十几个左右的文件。该应用程序创建了文件。不是应该能看到文件夹里的文件吗???
Manifest 具有以下权限 - 我认为它不需要全部:
<uses-permission android:name = "android.permission.MANAGE_EXTERNAL_STORAGE"/>
<uses-permission android:name = "android.permission.WRITE_EXTERNAL_STORAGE"/>
Run Code Online (Sandbox Code Playgroud)
没有权限显示为应用程序被拒绝
我想过使用外部存储 - 但似乎这在 Android …