Android App-targetSDKVersion28升级为30

06-01 164阅读

为什么要修改targetSDKVersion?

1、应用开发平台要求(小米)

2、更好的兼容新版本的手机

有targetSDKVersion的位置:

  • App的targetSDKVersion
  • Module中的targetSDKVersion
  • 引入的第三方库中有targetSDKVersion

    修改了App和Module中的targetSDKVersion。

    存储权限和存储位置问题

    修改原因:

    Android10(targetSdkVersion29)以后加入了分区存储,针对App设置了外置私有存储空间,卸载App时会被删除,一定程度上解决了卸载App后外置内存仍占用问题。

    Android10在获取存储权限上和之前版本有区别。

    修改前:

    • targetSDKVersion28
    • 使用EasyPermission框架获取权限。(长时间不更新且不支持新版本Android)
    • 视频、音频、文件存储在外置存储卡【Environment.getExternalStorageDirectory()】中。

      修改后:

      • targetSDKVersion30(Android 11)
      • 使用Permission替换EasyPermission获取权限
      • 视频、音频、文件存储存储在私有外置存储中【context.getExternalFilesDir()】。

        修改内容:

        • 兼容Android不同版本获取权限。
        • App新版本要处理老版本存储在外置存储卡中的内容。

          知识点:

          使用创建、读写文件测试对Environment.getExternalStorageDirectory()和context.getExternalFilesDir()目录的使用。

          Environment.getExternalStorageDirectory()

          Android App-targetSDKVersion28升级为30
          (图片来源网络,侵删)
          • Android13:同Android11
          • Android11:
            • 动态获取Manifest.permission.READ_EXTERNAL_STORAGE,Manifest.permission.WRITE_EXTERNAL_STORAGE权限后创建读写文件时显示permission denied。
            • 动态获取Manifest.permission.MANAGE_EXTERNAL_STORAGE权限后可以创建并读写文件,获取权限方式是通过Intent intent = Intent(Settings.ACTION_MANAGE_ALL_FILES_ACCESS_PERMISSION)跳转至设置页面,用户自行打开允许访问所有文件权限看后才可创建读写文件。
            • Android10:同Android11
            • Android9 动态获取Manifest.permission.READ_EXTERNAL_STORAGE,Manifest.permission.WRITE_EXTERNAL_STORAGE权限后可以创建并读写文件。
            • Android6:动态获取Manifest.permission.READ_EXTERNAL_STORAGE,Manifest.permission.WRITE_EXTERNAL_STORAGE权限后可以创建并读写文件。
            • Android5:不用获取权限可以创建并读写文件。

              context.getExternalFilesDir();

              • Android13:不用获取权限可以创建并读写文件。
              • Android11:不用获取权限可以创建并读写文件。
              • Android10:不用获取权限可以创建并读写文件。
              • Android9:不用获取权限可以创建并读写文件。
              • Android6:不用获取权限可以创建并读写文件。
              • Android5:不用获取权限可以创建并读写文件。

                修改方案:

                Android App-targetSDKVersion28升级为30
                (图片来源网络,侵删)
                • 修改视频、音频和文件存储位置为外置私有存储空间且不需要获取权限。
                • 为兼容App旧版本存储在外置存储卡中的视频、音频和文件,在读取外置存储卡中的视频、音频和文件时需获取存储权限。

                  读取相册照片和视频

                  修改原因:

                  Android App-targetSDKVersion28升级为30
                  (图片来源网络,侵删)
                  • Android10之后读取相册的权限不同且方法也不同。

                    修改前:

                    • 使用RxGalleryFinal框架(长时间不更新且不适配新版本Android)

                      修改后:

                      • 使用PictureSelector框架(适配Android10以后版本-内置有获取权限功能)

                        保存图片至相册

                        修改原因:

                        • Android10 添加至相册方式和位置不同。

                          修改后:

                          • 兼容不同Android版本

                            处理方法:

                            • Android9及之前版本,将图片保存至外置存储卡,然后通知将其添加到相册数据库,并刷新即可(需存储权限)。
                            • Android10及以后版本,不能将图片放置在私有外置存储空间(ContentResolver不支持,会提示错误),将图片放在公共媒体存放位置,然后刷新,使用ContentResolver实现。

                              实现代码如下:

                              package com.ypkj.kfpt.http;
                              import android.content.ContentResolver;
                              import android.content.ContentValues;
                              import android.content.Context;
                              import android.content.Intent;
                              import android.graphics.Bitmap;
                              import android.graphics.BitmapFactory;
                              import android.net.Uri;
                              import android.os.Build;
                              import android.os.Environment;
                              import android.os.Handler;
                              import android.os.Message;
                              import android.provider.MediaStore;
                              import android.text.TextUtils;
                              import android.text.format.DateUtils;
                              import android.util.Log;
                              import android.widget.Toast;
                              import androidx.fragment.app.FragmentActivity;
                              import com.learn.base.permission.PermissionsUtil;
                              import com.ypkj.kfpt.R;
                              import java.io.File;
                              import java.io.FileOutputStream;
                              import java.io.IOException;
                              import java.io.InputStream;
                              import java.io.OutputStream;
                              import java.net.URL;
                              import java.util.UUID;
                              /**
                               * 下载图片至相册的工具类
                               */
                              public class DonwloadSaveImg {
                                  private static Context context;
                                  private static String filePath;
                                  private static Bitmap mBitmap;
                                  private static String mSaveMessage = "失败";
                                  private final static String TAG = "PictureActivity";
                                  public static void donwloadImg( Context contexts, String filePaths) {
                                      context = contexts;
                                      filePath = filePaths;
                                      PermissionsUtil.getInstance().requestStoragePerm((FragmentActivity) contexts, "", new PermissionsUtil.BaseRequestCallback() {
                                          @Override
                                          public void onCallBack() {
                                              new Thread(saveFileRunnable).start();
                                          }
                                      });
                                  }
                                  private static Runnable saveFileRunnable = new Runnable() {
                                      @Override
                                      public void run() {
                                          try {
                                              if (!TextUtils.isEmpty(filePath)) { //网络图片
                                                  // 对资源链接
                                                  URL url = new URL(filePath);
                                                  //打开输入流
                                                  InputStream inputStream = url.openStream();
                                                  //对网上资源进行下载转换位图图片
                                                  mBitmap = BitmapFactory.decodeStream(inputStream);
                                                  inputStream.close();
                                              }
                                              saveBitmap(context, mBitmap);
                                              mSaveMessage = "图片保存成功!";
                                          } catch (IOException e) {
                                              mSaveMessage = "图片保存失败!";
                                              e.printStackTrace();
                                          } catch (Exception e) {
                                              e.printStackTrace();
                                          }
                                          messageHandler.sendMessage(messageHandler.obtainMessage());
                                      }
                                  };
                                  private static Handler messageHandler = new Handler() {
                                      @Override
                                      public void handleMessage(Message msg) {
                                          Log.d(TAG, mSaveMessage);
                                          Toast.makeText(context, mSaveMessage, Toast.LENGTH_SHORT).show();
                                      }
                                  };
                              
                                  // 保存bitmap到相册,并兼容AndroidQ
                                  public static boolean saveBitmap(Context context, Bitmap bitmap) {
                                      if (bitmap == null) {
                                          return false;
                                      }
                                      boolean isSaveSuccess;
                                      if (Build.VERSION.SDK_INT = Build.VERSION_CODES.R) {
                                              resolver.delete(uri, null);
                                          }
                                          return false;
                                      }
                                      return true;
                                  }
                                  public static String getBitmapFileDir() {
                                      String BITMAP_FILE_DIRECTORY = context.getString(R.string.appname);
                                      if (Build.VERSION.SDK_INT  
                              

                              参考文档:

                              • 一篇文章搞定《Android权限问题(全版本)》https://blog.csdn.net/weixin_45112340/article/details/128905213
                              • [ ]应用TargetSdkVersion 30升级适配指南 https://dev.mi.com/distribute/doc/details?pId=1738#_2
免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们。

目录[+]

取消
微信二维码
微信二维码
支付宝二维码