我想使用公共外部存储在设备中写入映像。因此,我有1)在清单中写入权限标签,2)在需要时使用check SelfPersion
请求权限。但我仍然有这个例外:java.io.FileNotFoundException: /storage/emulated/03b3d97bd-5186-4506-97dc-9994b7ce0761(权限拒绝)
。
为什么?我已经读过了https://developer.android.com/guide/topics/permissions/overview#normal-很危险,但这不能回答我的问题。
我已授予Android设备的存储权限。因此,我的条件if(permissionCheck!=PackageManager.PERMISSION\u grated){(见下文)未正确执行,但其条件else是正确的。此条件else包含一行用于将文件保存在存储器中:但它返回此异常。。。
如果用户已授予权限,则可以调用saveImageAndShareIt。
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
通常,由于具有写入权限,读取的应该被隐式识别。
下面是onRequest estPermissionsResult
方法。如果用户接受授予权限,则调用saveImageAndShareIt
。
@Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
System.out.println("onrequestPR");
if (grantResults.length > 0) {
if(grantResults[0] == PackageManager.PERMISSION_GRANTED) {
System.out.println("onrequestPR accepted");
saveImageAndShareIt();
}
}
}
onRequest estPermissionsResult
由Request estPerments
调用,如下所示:
if (Build.VERSION.SDK_INT >= 23) {
int permissionCheck = ContextCompat.checkSelfPermission(activity, Manifest.permission.WRITE_EXTERNAL_STORAGE);
if (permissionCheck != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(activity, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1);
} else {
System.out.println("last_case1");
saveImageAndShareIt();
System.out.println("last_case2");
}
} else {
System.out.println("peperoni");
saveImageAndShareIt();
System.out.println("pizza");
}
因此,如果用户已经授予了权限,则无需调用Request estPerments
,因此直接调用saveImageAndShareIt
(换句话说:onRequest estPermissionsResult
不需要执行调用saveImageAndShareIt
)。
异常由FileOutputStream
的实例化引发。
private void saveImageAndShareIt() {
OutputStream output;
try {
System.out.println("siasi1");
output = new FileOutputStream(Environment.getExternalStorageDirectory() + image_uuid);
byte[] buffer = new byte[1024];
int bytesRead;
BitmapDrawable bitmapDrawable = (BitmapDrawable) temp.getDrawable();
ByteArrayOutputStream stream = new ByteArrayOutputStream();
bitmapDrawable.getBitmap().compress(Bitmap.CompressFormat.JPEG, 100, stream);
byte[] imageInByte = stream.toByteArray();
ByteArrayInputStream bis = new ByteArrayInputStream(imageInByte);
while ((bytesRead = bis.read(buffer, 0, buffer.length)) >= 0) {
output.write(buffer, 0, bytesRead);
}
output.close();
System.out.println("siasi2");
intent_share.putExtra(Intent.EXTRA_STREAM, Uri.parse(Environment.getExternalStorageDirectory() + image_uuid));
activity.startActivity(Intent.createChooser(intent_share, "Share to"));
System.out.println("siasi3");
} catch(IOException e) {
e.printStackTrace();
}
}
带系统。错误:java。io。FileNotFoundException:/storage/simulated/03b3d97bd-5186-4506-97dc-9994b7ce0761(权限被拒绝),带系统。错误:在java。io。FileOutputStream。java上的open0(本机方法)。io。FileOutputStream。打开(FileOutputStream.java:287),带系统。错误:在java。io。FileOutputStream。(FileOutputStream.java:223)带系统。错误:在java。io。FileOutputStream。(FileOutputStream.java:110)位于com。实例ClipboardDialogFragment。saveImageAndShareIt(ClipboardDialogFragment.java:115)位于com。实例ClipboardDialogFragment。使用系统访问300美元(ClipboardDialogFragment.java:42)。错误:位于com。实例剪贴板对话框片段$1$2$1。onTaskCompleted(ClipboardDialogFragment.java:75),带系统。错误:位于com。实例下载ImageTask。com上的onPostExecute(DownloadImageTask.java:34)。实例下载ImageTask。onPostExecute(DownloadImageTask.java:10),带系统。错误:在android上。操作系统。异步任务。在android上完成(AsyncTask.java:695)。操作系统。异步任务-wrap1(未知源:0)带系统。错误:在android上。操作系统。AsyncTask$InternalHandler。handleMessage(AsyncTask.java:712),带系统。错误:在android上。操作系统。处理程序。android上的dispatchMessage(Handler.java:105)。操作系统。活套。android上的loop(Looper.java:164)。应用程序。ActivityThread。main(ActivityThread.java:6944)带系统。错误:在java。lang.reflect。方法在com上调用(本机方法)。Android内部的操作系统。受精卵$MethodandArgscaler。在com上运行(zyote.java:327)。Android内部的操作系统。合子岩。main(ZygoteInit.java:1374)
即使授予文件权限,您也无法访问SD卡和其他可移动媒体。如果我没有记错,因为KitKat,除非用户在内置文档应用程序中启用了访问权限。
您需要使用DocumentsProvider或通过StorageVolume获得另一个权限/uri,并使用DocumentsContract(示例项目)对其进行解析。
编辑:基于您的异常:
/storage/emulated/03b3d97bd-5186-4506-97dc-9994b7ce0761
默认的外部目录是存储/模拟/0,看起来您忘记在目录名后添加分隔符了:
output = new FileOutputStream(Environment.getExternalStorageDirectory() +"/"+ image_uuid);
我在清单中添加了对外部存储设备的写访问权限,并在我的Android手机中授予了这些权限。如果他们不存在,我甚至会在执行时要求他们。 然而,我总是得到这个例外: Java语言io。FileNotFoundException:/storage/simulated/03b3d97bd-5186-4506-97dc-9994b7ce0761(权限被拒绝) 你知道为什么吗? 在清单文件中:
我添加了使用权限,包括WRITE_EXTERNAL_STORAGE,android.permission.相机,READ_EXTERNAL_STORAGEAndroidManifest.xml. 当我在Nexus6(API 24)中运行我的应用程序时,它向我抛出了以下错误: java.io.IOException:权限被拒绝 这是我的代码: 如何在权限相机运行时打开之前使用它?
在这一点上我得到了警告: 如何让它保存文件?当我在Eclipse上创建它时,这是可行的,但是现在我更新并移到了Android Studio中,它似乎坏了一些东西。
我正在尝试为我的Android应用程序请求运行时权限。这是我的代码: 在我的AndroidManifest中。xml: 但是,上面的代码始终显示权限被拒绝,而不提示用户请求权限。有什么想法吗? 谢谢
我分配一个角色权限来创建数据库。相同的角色被分配给登录用户,但是当我试图使用分配角色的登录用户创建新数据库时,我得到权限拒绝错误。 无法执行语句。权限拒绝,数据库主,所有者dbo。运行此命令需要以下权限:CREATE DATABASE。赛贝斯错误代码=10331严重级别=14,状态=3,事务状态=0第1行 我用15.5分和16分试了一下。我做错什么了吗?我们需要考虑其他参数吗?我经历了这次讨论 h
我试图保存一个csv文件到我的手机和我的目标SDK级别是26,所以我试图检查运行时的权限,而运行我的应用程序。尽管我在清单文件中赋予了必要的权限,但在检查此权限的活动中返回false。我怎么才能修好这个? 清单文件的开始 活动的相关部分如下