android创建文件的权限
‘壹’ Android——Android10的分区存储(Scoped Storage)
在Android10以前,只要程序获得了READ_EXTERNAL_STORAGE权限,就可以随意读取外部的存储公有目录。只要程序获得了WRITE_EXTERNAL_STORAGE权限,就可以随意在写入外部存储的公有目录上新建文件或文件夹
于是Google在Android10中提出了分区存储,意在限制程序对外部存储中公有目录的使用。
分区存储对内部存储私有目录和外部存储私有目录都没有影响
简单来说就是,在Android10中,
使用分区存储的应用对自己创建的文件始终拥有读/写权限, 无论文件是否位于应用的私有目录内 ,所腊好以,如果应用仅保存和访问自己创建的文件,则无需请求获得READ_EXTERNAL_STORAGE或WRITE_EXTERNAL_STORAGE权限
如果要访问其他应用创建的文件,则需要READ_EXTERNAL_STORAGE权限。并且仍然只能使用MediaStore提供的API或是SAF访问。
这里需要注意的是,MediaStore提供的API只能访问图片、视频、音频,如果需要访问其它任意格式的文件,需要使用SAF,它会调用系统内置的文件浏览器供用户自主选择文件
Android Q规定了App有两种存储空间模式视图:Legacy View、Filtered View
系统通过下列方式确定App的运行模式:
判断当前App运行的是什么模式,可以通过Environment提供的API进行判断
MediaStore提供了下列几种类型圆闷的访问Uri,通过查找对应Uri数据,达到访问的目的。
我们还可以使用getContentUri获取所有<volumeName>
MediaProvider对于App存放到公共目录文件,通过ContentResolver insert方法中Uri来确定
MediaStroe通过不同Uri,为用户提供了增、删、改方法,权限对应如下
例如PDF,PDF为非媒体类文件,因此我们不能通过MediaStore来获取,对于这种其他类型的文件,一般使用SAF来让用户选择
我们也推荐使用SAF让用户自己去创建,IntentAction为:ACTION_CREATE_DOCUMENT
访问app-specific分为橘局弯两种情况,一种是访问App自身App-specific目录,第二是访问其他App目录文件
Android Q,App如果启动了Filtered View,那么只能直接访问自己目录的文件:
App是FilteredView,其他App无法直接访问当前App私有目录,需要通过以下方法:
‘贰’ 安卓开发中,需要创建一个新文件,并读写,要加入什么权限
安卓开发中,需要创建一个新文件,并读写,要加入什么权限?
如果是在手机上新建,需要root权限,手机要先破解。如果不是在手机上操作那不需要权限,直接在电脑上弄好了刷进去就可以了。
linux下创建一个新文件用什么命令
1. touch filename 建立一个空文件
2. cat > filename 建立一文件,然后把接下来的键盘输入写入文件,直到按Ctrl+D为止
还有像楼上说的把/dev/null复制过去
Word和Excel中创建一个新文件,在该文件中创建一个宏,那个宏是什么意思?
是一小段程序代码
安卓开发 assets中怎么更新文件
读输入流的方法:通过读输入流返回一个String
/**
* 读输入流
*
* @param is
* @return
*/
public static String getStringByInputStream(InputStream is) {
String content = null;
try {
if (is != null) {
byte[] buffer = new byte[is.available()];
ByteArrayOutputStream arrayOutputStream = new ByteArrayOutputStream();
while (true) {
int readLength = is.read(buffer);
if (readLength == -1)
break;
arrayOutputStream.write(buffer, 0, readLength);
}
is.close();
arrayOutputStream.close();
content = new String(arrayOutputStream.toByteArray());
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
content = null;
} finally {
try {
if (is != null)
is.close();
} catch (IOException ioe) {
ioe.printStackTrace();
}
}
return content;
}
读assets文件的方法:
public static String readAssets(Context context, String fileName) {
InputStream is = null;
try {
is = context.getAssets().open(fileName);
} catch (IOException e) {
e.printStackTrace();
}
return getStringByInputStream(is);
}
3
读raw文件的方法:
public static String readRaws(Context context, int id) {
InputStream is = context.getResources().openRawResource(id);
return getStringByInputStream(is);
}
在文件哪创建一个新文件夹叫 SAVE 就可以了~~~~~~~~~~~~ ,怎么创建啊要图
明白了,
右击游戏图标-属性-查找目标-右击-新尘巧猜建-文件夹-命名-OK
电脑无法创建一个新文件夹怎么办
无法创建新文件夹的问题,一般可能是以下原因引起的 1 权限设置不当 检查相关权限,检查WINDOWS用户是否拥有建立文件的权限,如果没有,请换用管理员登陆,或者使用管理员舔加管理权限。如果是管理员,在gpedit.msc里添加相关权限。 2 磁盘管理错误 如果长时间的使用BT和电驴等派型P2P软件,磁盘缓存设置不当也宽吵可能造成磁盘目录的混乱,从而造成磁盘目录错误,引起目录检索错误,引发问题出现。 3 磁盘控制器错误 一般来说这种错误很罕见,正常情况更新磁盘驱动即可解决问题。也不知道是不是你的软件冲突所致。如果是硬盘上集成的控制器出问题了见最后的回答。 4 易失性数据错误 一般来说是由系统文件的紊乱错误引起的,但是你重新安装过系统,问题也就排除了。 使用优化大师对你的盘进行检测和修复,如果这样还不行的话我就暂时没有办法了. 电脑中毒了。 先在安全模式杀毒再创建文件夹
怎么样用CMD在D盘创建一个新文件夹?
cmd 回车
d: 回车
md 文件夹名称 回车
为什么word会总动保存创建一个新文件与桌面
问题 表述不清,据猜测,楼主是问每打开一个word文件,都会看到一个新文件自动创建,那是word自动创建的一个临时文件,关闭文档后,这个临时文件会被自动删除掉,通常情况它是隐藏文件,如果这个临时文件没有被删除掉,如果文档出现问题了,可以通过这个临时文件恢复挽救一部分内容。
打开coreldrawX4时能不能自动创建一个新文件。
可以,在选项-工作区-常规里有个CorelDRAW启动,后面有选项.
如何在虚拟光驱里创建一个新文件夹
那要在没有加载之前编辑ISO文件加入的,已经加载了 是没有办法创建,因为光驱格式是只读模式的.
‘叁’ android 10 文件夹和文件创建
Android 10 改变了文件的存储方式不允许应用随意创建文件夹了,要用安卓提供的文件夹,提供的文件夹如下
public static void createPath(String path) {
File file =new File(path);
if (!file.exists()) {
try {
// 获取父文件
File parent = file.getParentFile();
if( !parent.exists() ) {
parent.mkdirs(); //创建所有父文件夹
}
file.createNewFile();
}catch (IOException e) {
e.printStackTrace();
}
}
}
‘肆’ 解决Android创建文件夹失败
在开发过程中,使用File.mkdirs()会返回false创建文件夹失败,有可能是权限不够的原因,需要在AndroidManifest.xml中添加如下权限:
但有的权限可能会报Permission is only granted to system apps错误,导致权限申请失败,
原因是运行时权限:API 23之前的版本都是自动获取权限,而从 Android 6.0 开始添加了权限申请的需求,更加安全。在android6.0以前,我们程序需要的权限我们一般只需要在AndroidManifest.xml中直接更新就好,然而Android 6.0在我们原有的AndroidManifest.xml声明权限的基础上,又新增了运行时权限动态检测。
如果你的程序在6.0以上的手机报权限的问题,简单粗暴最有效的解决方法是在工程下的build.gradle中的 targetSdkVersion 改为21或22,因为Android6.0系统或以上默认为targetSdkVersion小于23的应用默认授予了所申请的所有权限。
‘伍’ Android的权限都有哪些
(一)linux文件系统上的权限
-rwxr-x--x system system 4156 2010-04-30 16:13 test.apk
代表的是相应的用户/用户组及其他人对此文件的访问权限,与此文件运行起来具有的权限完全不相关。
比如上面的例子只能说明system用户拥有对此文件的读写执行权限;system组的用户对此文件拥有读、执行权限;其他人对此文件只具有执行权限。
而test.apk运行起来后可以干哪些事情,跟这个就不相关了。
千万不要看apk文件系统上属于system/system用户及用户组,或者root/root用户及用户组,就认为apk具有system或root权限
(二)Android的权限规则
(1)Android中的apk必须签名
这种签名不是基于权威证书的,不会决定某个应用允不允许安装,而是一种自签名证书。
重要的是,android系统有的权限是基于签名的。比如:system等级的权限有专门对应的签名,签名不对,权限也就获取不到。
默认生成的APK文件是debug签名的。
获取system权限时用到的签名,见:如何使Android应用程序获取系统权限
(2)基于UserID的进程级别的安全机制
大家都知道,进程有独立的地址空间,进程与进程间默认是不能互相访问的,是一种很可靠的保护机制。
Android通过为每一个安装在设备上的包(apk)分配唯一的linux userID来实现,名称为"app_"加一个数字,比如app_43
不同的UserID,运行在不同的进程,所以apk之间默认便不能相互访问。
Android提供了如下的一种机制,可以使两个apk打破前面讲的这种壁垒。
在AndroidManifest.xml中利用sharedUserId属性给不同的package分配相同的userID,通过这样做,两个package可以被当做同一个程序,
系统会分配给两个程序相同的UserID。当然,基于安全考虑,两个package需要有相同的签名,否则没有验证也就没有意义了。
(这里补充一点:并不是说分配了同样的UserID,两程序就运行在同一进程, 下面为PS指令摘取的,
显然,system、app_2分别对应的两个进程的PID都不同,不知Android到底是怎样实现它的机制的)
User PID PPID
system 953 883 187340 55052 ffffffff afe0cbcc S system_server
app_2 1072 883 100264 19564 ffffffff afe0dcc4 S com.android.inputmethod.
system 1083 883 111808 23192 ffffffff afe0dcc4 S android.process.omsservi
app_2 1088 883 156464 45720 ffffffff afe0dcc4 S android.process.acore
(3)默认apk生成的数据对外是不可见的
实现方法是:Android会为程序存储的数据分配该程序的UserID。
借助于Linux严格的文件系统访问权限,便实现了apk之间不能相互访问似有数据的机制。
例:我的应用创建的一个文件,默认权限如下,可以看到只有UserID为app_21的程序才能读写该文件。
-rw------- app_21 app_21 87650 2000-01-01 09:48 test.txt
如何对外开放?
<1> 使用MODE_WORLD_READABLE and/or MODE_WORLD_WRITEABLE 标记。
When creating a new file with getSharedPreferences(String, int), openFileOutput(String, int), or openOrCreateDatabase(String, int, SQLiteDatabase.CursorFactory), you can use the MODE_WORLD_READABLE and/or MODE_WORLD_WRITEABLE flags to allow any other package to read/write the file. When setting these flags, the file is still owned by your application, but its global read and/or write permissions have been set appropriately so any other application can see it.
(4)AndroidManifest.xml中的显式权限声明
Android默认应用是没有任何权限去操作其他应用或系统相关特性的,应用在进行某些操作时都需要显式地去申请相应的权限。
一般以下动作时都需要申请相应的权限:
A particular permission may be enforced at a number of places ring your program's operation:
At the time of a call into the system, to prevent an application from executing certain functions.
When starting an activity, to prevent applications from launching activities of other applications.
Both sending and receiving broadcasts, to control who can receive your broadcast or who can send a broadcast to you.
When accessing and operating on a content provider.
Binding or starting a service.
在应用安装的时候,package installer会检测该应用请求的权限,根据该应用的签名或者提示用户来分配相应的权限。
在程序运行期间是不检测权限的。如果安装时权限获取失败,那执行就会出错,不会提示用户权限不够。
大多数情况下,权限不足导致的失败会引发一个 SecurityException, 会在系统log(system log)中有相关记录。
(5)权限继承/UserID继承
当我们遇到apk权限不足时,我们有时会考虑写一个linux程序,然后由apk调用它去完成某个它没有权限完成的事情,很遗憾,这种方法是行不通的。
前面讲过,android权限是经营在进程层面的,也就是说一个apk应用启动的子进程的权限不可能超越其父进程的权限(即apk的权限),
即使单独运行某个应用有权限做某事,但如果它是由一个apk调用的,那权限就会被限制。
实际上,android是通过给子进程分配父进程的UserID实现这一机制的。
(三)常见权限不足问题分析
首先要知道,普通apk程序是运行在非root、非system层级的,也就是说看要访问的文件的权限时,看的是最后三位。
另外,通过system/app安装的apk的权限一般比直接安装或adb install安装的apk的权限要高一些。
言归正传,运行一个android应用程序过程中遇到权限不足,一般分为两种情况:
(1)Log中可明显看到权限不足的提示。
此种情况一般是AndroidManifest.xml中缺少相应的权限设置,好好查找一番权限列表,应该就可解决,是最易处理的情况。
有时权限都加上了,但还是报权限不足,是什么情况呢?
Android系统有一些API及权限是需要apk具有一定的等级才能运行的。
比如 SystemClock.setCurrentTimeMillis()修改系统时间,WRITE_SECURE_SETTINGS权限好像都是需要有system级的权限才行。
也就是说UserID是system.
(2)Log里没有报权限不足,而是一些其他Exception的提示,这也有可能是权限不足造成的。
比如:我们常会想读/写一个配置文件或其他一些不是自己创建的文件,常会报java.io.FileNotFoundException错误。
系统认为比较重要的文件一般权限设置的也会比较严格,特别是一些很重要的(配置)文件或目录。
如
-r--r----- bluetooth bluetooth 935 2010-07-09 20:21 dbus.conf
drwxrwx--x system system 2010-07-07 02:05 data
dbus.conf好像是蓝牙的配置文件,从权限上来看,根本就不可能改动,非bluetooth用户连读的权利都没有。
/data目录下存的是所有程序的私有数据,默认情况下android是不允许普通apk访问/data目录下内容的,通过data目录的权限设置可知,其他用户没有读的权限。
所以adb普通权限下在data目录下敲ls命令,会得到opendir failed, Permission denied的错误,通过代码file.listfiles()也无法获得data目录下的内容。
‘陆’ 安卓12根目录禁止创建文件
右键属性点击最后的安全把写入后面的禁止创建文件的勾去掉就行。
在文件夹里操作写入是非常容易的事情,直接点击鼠标右键复制粘贴或是利用快捷键操作就可以做得到。但有些人在某个文件夹里放了重要的文件,而电脑又不是个人用而是共用的,所以他们会希望将这个文件夹设置禁止写入,不被别人轻易操作或是删除掉。要将文件夹做到这点不难,但需要掌握相关的设置方法。
随着使用电脑的人越来越多,自己电脑的隐私受到很多人的重视很多人都会讲自己的电脑设置密码或者是将文件夹写入权限。很多时候,别人会动我们的电脑然后随意的修改或乱放入我们的文件夹里面的文件,那么如果不想让你的文件夹被别人操作的话就可以对文件夹设置禁止写入的权限,这样也能更好的保护文件夹。