Android 权限常量保存在哪个类中

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android 权限常量保存在哪个类中相关的知识,希望对你有一定的参考价值。

  1. 保存键值对(Saving Key-Value Sets)
  如果你要存储存储小型的键值对(key-value)数据集的话,可以使用SharedPreferences API。SharedPreferences对象是一个包含键值对的文件,提供了读和写的方法。每一个SharedPreferences文件都被框架(framework)管理,并且既可以是私有的,也可以使公有的。以下内容主要是:使用SharedPreferences APIs 来存储和检索简单的数值。
  
  
  Write to Shared Preferences
  要写入数据,
  1.先在SharedPreferences通过调用edit()方法创建一个SharedPreferences.Editor 。
  2.通过putInt()和putString()来把键值对写入,
  3.然后调用commit()方法来保存。
  For example:
  //新建一个SharedPreferences文件,设定为private模式
  SharedPreferences sharedPref = getActivity().getPreferences(Context.MODE_PRIVATE);
  //新建一个editor对象,通过SharedPreferences对象的edit()方法。
  SharedPreferences.Editor editor = sharedPref.edit();
  //调用editor的putInt()方法,参数就是键值对。
  editor.putInt(getString(R.string.saved_high_score), newHighScore);
  //调用editor的commit()方法,保存。
  editor.commit();
  
  Read from Shared Preferences
  调用SharedPreferences对象的getInt()方法和getString()方法,读取SharedPreferences文件。参数可以写default,也可以写key。返回值都是value。
  //创建一个SharedPreferences对象
  SharedPreferences sharedPref = getActivity().getPreferences(Context.MODE_PRIVATE);
  //参数我default情况
  long default = getResources().getInteger(R.string.saved_high_score_default));
  //参数为(key,default)情况
  long highScore = sharedPref.getInt(getString(R.string.saved_high_score), default);
  
  2.保存文件(saving files)
  android系统里对文件进行读写,主要使用了File APIs。
  File对象主要用来读写大的数据量。比如图像文件、通过网络交换的文件。
  以下内容基于读者已经了解Linux文件系统以及java.io里的标准文件输入输出API。
  
  
  内部存储Internal storage的特点:
  1.一直可用
  2.是默认程序的默认文件访问位置,其他app访问不了。
  3.卸载app时,系统会删除这个app所有文件
  Internal storage 可以确保用户和其他app无法访问你的文件。很好的私密性。
  
  外部存储External storage的特点:
  1.并非一直可用。可以插在卡槽,但是卸载掉,这时候系统就看不到了,或者用户把sd卡当U盘使。
  2.文件存储不安全。sd卡拿出来,里面的信息就泄露了。
  3.卸载app时,只有你在路径getExternalFilesDir()保存文件的时候,系统才可以删除这个app的文件。
  如果不在这个路径的话,那SD卡上就会有残留文件了。
  如果文件没有访问限制,或者你想让文件为其他app所用,或者希望通过电脑查看,外部存储不失为一种好方法。
  
  TIPS:可以设置manifest文件里的android:installLocation属性来让app装在外部存储。
  
  Obtain Permissions for External Storage
  要向外部存储写文件,必须在manifest文件里声明WRITE_EXTERNAL_STORAGE权限。
  <manifest ...>
  <uses-permission
  //写入外部存储文件的权限
  android:name="android.permission.WRITE_EXTERNAL_STORAGE"
  />
  ...
  </manifest>
  
  注意:目前,所有的app都可以读取外部存储上的文件,不需要特殊的权限。但是以后这个肯定要改的,读取外部存储的文件也是需要权限的。所以也要在manifest文件里声明READ_EXTERNAL_STORAGE权限。
  <manifest ...>
  <uses-permission
  //读取外部存储文件的权限
  android:name="android.permission.READ_EXTERNAL_STORAGE"
  />
  ...
  </manifest>
  
  往内部存储写文件是不需要权限的,从内部存储读文件也是不需要权限的。
  所以内外存储文件还有权限上的区别:外部的要权限,内部的不需要。
  
  Save a File on Internal Storage
  保存一个文件到内部存储的时候,需要获得一个存储路径,方法有二:
  1.getFilesDir()--------返回文件File路径
  2.getCacheDir()--------返回一个缓存文件路径
  临时缓存文件里存放着temporary cache files,确保不用这些文件的时候删除,并有size上的控制,系统在低存储空间的时候,会直接删除这个临时文件夹内容。
  
  在存储路径上创建文件时候,使用File()构造器,参数为路径,和文件名称。
  //使用File()构造器,参数1:文件路径 参数2:文件名称
  File file = new File(context.getFilesDir(), filename);
  
  或者,可以调用openFileOutput()方法来获取FileOutputStream,来向内部存储路径写文件。
  String filename = "myfile";
  String string = "Hello world!";
  FileOutputStream outputStream;
  try
  //调用方法创建流,参数1:文件名参数2:文件类型为私有
  putStream = openFileOutput(filename, Context.MODE_PRIVATE);
  //调用流的write方法
  outputStream.write(string.getBytes());
  //关闭流
  outputStream.close();
  
  catch (Exception e)
  e.printStackTrace();
  
  
  如果要创建一个缓存文件,就要用createTempFile()方法。
  以下代码从url提取文件name,然后用那个name在缓存文件夹创建一个文件。
  public File getTempFile(Context context, String url)
  File file;
  try
  String fileName = Uri.parse(url).getLastPathSegment();
  file = File.createTempFile(fileName, null, context.getCacheDir());
  catch (IOException e)
  // Error while creating file
  
  return file;
  
  
  注意:app的内部存储路径是由你的app的包的名称指定的,在android文件系统的特定位置。技术上看,如果你把文件mode设置为可读,其他app是可以读取你的app的数据的。但是其他app要想读取,必须要知道你的包的名称和文件的名称。除非你明确设定file mode为readable或者writable,否则其他app肯定没法读和写你的internal file。 所以,只要你把文件mode设置为Context.MODE_PRIVATE,其他app是无论如何也没法访问到这个文件的。
  
  Save a File on External Storage
  因为外部存储有可能不可用,所以用之前要查询一下外部存储的状态,使用之前肯定要查一下外部存储的可用空间。调用getExternalStorageState()方法,如果返回的状态是MEDIA_MOUNTED的话,外部存储就是可用的,包括读和写。
  //检查外部存储是否可以读和写
  public boolean isExternalStorageWritable()
  String state = Environment.getExternalStorageState();
  if (Environment.MEDIA_MOUNTED.equals(state))
  return true;
  
  return false;
  
  //查看外部存储是否至少可读
  public boolean isExternalStorageReadable()
  String state = Environment.getExternalStorageState();
  if (Environment.MEDIA_MOUNTED.equals(state) ||
  Environment.MEDIA_MOUNTED_READ_ONLY.equals(state))
  return true;
  
  return false;
  
  
  有两个文件夹来存放文件:
  1.公共文件夹(Public files)
  其他用户和app都可以访问,app卸载以后,文件仍然存在,其他app和用户可以继续使用。
  比如:app拍的照片
  2.私有文件夹(Private files)
  文件私有,其他用户和app无权访问。app卸载以后,文件即被删除。尽管文件存储在外部存储上,其他用户
  和app是可以访问的,但是实际上,这些文件是不会向app以外的其他用户提供数据的。、
  比如:app下载的内容和临时文件
  
  存储public文件到外部存储:调用getExternalStoragePublicDirectory()方法。这个方法有个参数,来指定你要存储文件的类型,这样,其他公共文件夹就可以将其包括进去。比如 DIRECTORY_MUSIC和 DIRECTORY_PICTURES。
  public File getAlbumStorageDir(String albumName)
  // 获取用户公共图片文件夹路径
  File file = new File(Environment.getExternalStoragePublicDirectory(
  Environment.DIRECTORY_PICTURES), albumName);
  if (!file.mkdirs())
  Log.e(LOG_TAG, "Directory not created");
  
  return file;
  
  
  存储public文件到外部存储:调用getExternalStoragePublicDirectory()方法。这个方法有个参数,来指定你要存储文件的类型,这样,其他公共文件夹就可以将其包括进去。比如 DIRECTORY_MUSIC和 DIRECTORY_PICTURES。
  public File getAlbumStorageDir(String albumName)
  // 获取用户公共图片文件夹路径
  // 参数1:Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES)
  // 参数2:albumName
  File file = new File(Environment.getExternalStoragePublicDirectory(
  Environment.DIRECTORY_PICTURES), albumName);
  if (!file.mkdirs())
  Log.e(LOG_TAG, "Directory not created");
  
  return file;
  
  
  存储private文件到外部存储:调用getExternalFilesDir()方法,也要传入一个指定文件类型的参数。以下是创建一个私人相册的文件的代码:
  public File getAlbumStorageDir(Context context, String albumName)
  // 获取应用的私人相册文件路径
  //参数1:context.getExternalFilesDir(Environment.DIRECTORY_PICTURES)
  //参数2:albumName
  File file = new File(context.getExternalFilesDir(Environment.DIRECTORY_PICTURES), albumName);
  
  if (!file.mkdirs())
  Log.e(LOG_TAG, "Directory not created");
  
  return file;
  
  也可以调用 getExternalFilesDir()方法,传如null参数,这样就会返回外部存储的根目录。
  记住:
  1. getExternalFilesDir()方法创建的文件路径,会在用户卸载这个app的时候被删除。
  2. 如果想让你的文件路径在app被卸载以后仍然存在,那么getExternalStoragePublicDirectory() 是一个更好的选择。
  3.无论是建立可以共享的文件路径,还是私有文件路径,使用API 常量来指定文件目录类型是很重要的。比如,DIRECTORY_PICTURES,这可以确保系统正确的识别目录里的数据。
  
  Query Free Space
  如果你事先知道要存储的数据量的大小,你就可以先查询一下可用空间有多少, 这样就可以避免IOException,可用的方法是:getFreeSpace()和getTotalSpace()。
  getFreeSpace()---返回剩余空间
  getTotalSpace()---返回总空间。
  
  但是返回的可用空间大小,并不说明,你就可以存入这么多的数据。如果空间比你要存入的数据大几M,或者空间被占用率小于90%,都还可以,反之,就未必能存入。
  
  并不需要每次存文件之前都来这么个判断,加个异常捕捉就OK。而且,你也未必知道你要存入的数据有多大,你想判断,也没法判断的,所以能catch这个IOException就行。
  
  Delete a File
  删除文件最简单的方法是调用文件本身的方法:delete()
  myFile.delete();
  如果文件存储在内部存储介质上,可以利用上下文的方法:deleteFile()
  myContext.deleteFile(fileName);
  
  注意:当用户卸载app时候,系统会删除以下文件:
  1.所有存储在内部介质上的数据
  2.使用getExternalFilesDir()创建路径的外部介质上的数据
  但是,所有缓存文件夹是需要手动删除的
  
  
  
参考技术A 雷锋来了
android.Manifest.permission
permission是Manifest的一个内部类
参考技术B android 权限在 Manifest文件中声明,不知道你问的什么意思

Android:检查是不是在另一个类中授予权限,而不是在 MainActivity

【中文标题】Android:检查是不是在另一个类中授予权限,而不是在 MainActivity【英文标题】:Android: Check if Permisson is granted in another Class, not in the MainActivityAndroid:检查是否在另一个类中授予权限,而不是在 MainActivity 【发布时间】:2021-12-19 17:31:02 【问题描述】:

我是 Android 应用程序开发的新手,我真的很想知道是否有一种方法可以检查另一个类(一个收集一些位置数据的前台服务),如果在主 Activity 中提供了位置权限。

在我的主要活动中,我在应用启动时直接请求权限,如下所示:

private fun requestPermissions() 
        ActivityCompat.requestPermissions(
            this,
            arrayOf(Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION),
            PERMISSION_ID
        )
    


    override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<String>, grantResults: IntArray) 
        super.onRequestPermissionsResult(requestCode, permissions, grantResults)
        if (requestCode == PERMISSION_ID) 
            if ((grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED)) 
                Toast.makeText(this, "Right Permissions Granted", Toast.LENGTH_LONG).show()
            
        
    

它可以正常工作,我可以授予我的应用访问该位置的权限。要在我的另一个 I 类中使用一个函数,我需要检查是否授予了权限,我这样做是这样的:

fun dummy()
        if (ActivityCompat.checkSelfPermission(
                this,
                Manifest.permission.ACCESS_FINE_LOCATION
            ) == PackageManager.PERMISSION_GRANTED
        ) 
        // do work that needs the location permission
      
    

但是,如果我尝试执行这个函数,我会得到一个空指针引用。我在这里错过了什么?

谢谢!

【问题讨论】:

在检查权限之前不要开始其他课程。 【参考方案1】:

您不能向服务请求权限。原因是当请求权限对话框出现时,用户自然会认为它属于前台应用程序。这种混乱是谷歌不允许这样做的原因。我最好的建议是启动一个 Activity,然后请求许可。

【讨论】:

以上是关于Android 权限常量保存在哪个类中的主要内容,如果未能解决你的问题,请参考以下文章

请问,我的androi studio中动态申请权限,Manifest.permission.WRITE_EXTERNAL_STORAGE

安全保存常数值

Android 訪问权限清单

Android系统权限配置

在 Android Marshmallow 检查权限

如何覆盖模块中的类常量和方法?