Android Q(10)パーティションの記憶が完璧で適切な方法です。


前言
最近の時間はAndroid dQの適配をしています。今日までAndroid dQパーティションの記憶は適切に完了しました。その間に多くのピットが現れました。現在のネット上の書き込みの大部分は概括的な変更内容です。次のいくつかの書き込みは全部パーティションに対して実際の経験コードの総括を格納し、穴埋めの経験をまとめました。
 本編は主にAndroid dQ(10)パーティションの記憶に適した具体的な実現です。
  • ポイント:
  • Android Qファイル格納メカニズムは、サンドボックスモード
  • に変更されました。
  • APPは、自分のディレクトリの下のファイルと公共メディアファイル
  • にしかアクセスできません。
  • は、Android dQ以下であるか、それとも古いファイル記憶方式
  • を使用するか?
    ここで注意したいのですが、Android Qに適合する場合は、Qシステムのバージョン以下に対応してSDK_を使用します。VERION区分
    背景
    保存権限
    Android QはREAD_を使用しています。EXTERNAL_STORAGEとWRITE_EXTERNAL_STORAGEは関連運転時権限を格納していますが、これらの権限を取得しても外部メモリにアクセスすることが制限されています。自身のディレクトリのファイルと公共の内部ファイルにのみアクセスできます。
    外部記憶構造区分
    共有ディレクトリ:Downloads、Dcuments、Pictures、DCIM、Movies、Music、Ringtonsなど
    住所:/storge/emulated/0/Downloads(Pictures)など
    共有ディレクトリ下のファイルは、APPのアンインストールに従って削除されません。
    APPプライベートディレクトリ
    住所:/storge/emulated/0/Android/data/パッケージ名/files
    プライベートディレクトリは、アプリのプライベートファイルを保存します。アプリのアンインストールによって削除されます。
    適切な指導
    Android QでContentResolaverを使ってファイルの添削を行います。
    1、自己ディレクトリ下のフォルダを取得(作成)する
    取得と作成は、携帯電話に対応するフォルダがないとシステムが自動的に生成されます。
    
    //        apk   
    File apkFile = context.getExternalFilesDir("apk");
    
    2、自身のディレクトリのファイルを作成します。
    ダウンロードするパスを生成し、入出力ストリームで書き込みを読み込みます。
    
    String apkFilePath = context.getExternalFilesDir("apk").getAbsolutePath();
    File newFile = new File(apkFilePath + File.separator + "temp.apk");
    OutputStream os = null;
    try {
      os = new FileOutputStream(newFile);
      if (os != null) {
        os.write("file is created".getBytes(StandardCharsets.UTF_8));
        os.flush();
      }
    } catch (IOException e) {
    } finally {
      try {
        if (os != null) {
          os.close();
        }
      } catch (IOException e1) {
        
      }
    }
    
    3、パブリックフォルダの作成
    Media Store.insertで書き込みます。
    
    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) {
      return null;
    }
    ContentResolver resolver = context.getContentResolver();
    ContentValues values = new ContentValues();
    values.put(MediaStore.Downloads.DISPLAY_NAME, fileName);
    values.put(MediaStore.Downloads.DESCRIPTION, fileName);
    //      
    values.put(MediaStore.Downloads.MIME_TYPE, "application/vnd.android.package-archive");
    //  MediaStore.Downloads.RELATIVE_PATH  targetVersion=29,
    //       Android10      
    values.put(MediaStore.Downloads.RELATIVE_PATH, "Download" + File.separator + "apk");
    Uri external = MediaStore.Downloads.EXTERNAL_CONTENT_URI;
    Uri insertUri = resolver.insert(external, values);
    return insertUri;
    
    4、パブリックディレクトリ下の指定フォルダからファイルを作成する
    上記のコードに合わせて、私達は主に公共のディレクトリの下でファイルまたはフォルダを作成し、ローカルパスuriを取得します。次に入出力ストリームを使ってファイルに書き込むことができます。
    ポイント:Android Qではfileに対応していません。/タイプのアクセスファイルはuriでしかアクセスできません。
    
    ContentResolver resolver = context.getContentResolver();
    Uri insertUri = resolver.insert(external, values);
    if(insertUri == null) {
      return;
    }
    String mFilePath = insertUri.toString();
    InputStream is = null;
    OutputStream os = null;
    try {
      os = resolver.openOutputStream(insertUri);
      if(os == null){
        return;
      }
      int read;
      File sourceFile = new File(sourcePath);
      if (sourceFile.exists()) { //      
        is = new FileInputStream(sourceFile); //      
        byte[] buffer = new byte[1024];
        while ((read = is.read(buffer)) != -1) {
          os.write(buffer, 0, read);
        }
      }
    } catch (Exception e) {
      e.printStackTrace();
    }finally {
      try {
        if (is != null) {
          is.close();
        }
        if (os != null) {
          os.close();
        }
      } catch (IOException e) {
        e.printStackTrace();
      }
    }
    
    
    5、Media Storeでパブリックディレクトリの下のファイルを読み込みます。
    
    ParcelFileDescriptor parcelFileDescriptor = null;
    FileDescriptor fileDescriptor = null;
    Bitmap tagBitmap = null;
    try {
      parcelFileDescriptor = context.getContentResolver().openFileDescriptor(uri, "r");
          
      if (parcelFileDescriptor != null && parcelFileDescriptor.getFileDescriptor() != null) {
        fileDescriptor = parcelFileDescriptor.getFileDescriptor();
        //  uri bitmap  
        tagBitmap = BitmapFactory.decodeFileDescriptor(fileDescriptor);
      }
    } catch (FileNotFoundException e) {
      e.printStackTrace();
    } catch (IOException e) {
      e.printStackTrace();
    } finally {
      try {
        if (parcelFileDescriptor != null) {
          parcelFileDescriptor.close();
        }
      } catch (IOException e) {
      }
    }
    
    6、Media Storeでファイルを削除する
    
    context.getContentResolver().delete(fileUri, null, null);
    7、APPはMedia Storeを通じてファイルにアクセスするために必要な権限
    header 1
    権限なし
    READ_EXTERNAL
    Audio
    APPが自分で作成したファイルを読むことができますが、直接にパスを使ってアクセスすることはできません。
    他のAPPで作成されたメディアファイルを読むことができます。削除操作にはユーザーの権限が必要です。
    Image
    APPが自分で作成したファイルを読むことができますが、直接にパスを使ってアクセスすることはできません。
    他のAPPで作成されたメディアファイルを読むことができます。削除操作にはユーザーの権限が必要です。
    ファイル
    APPが自分で作成したファイルを読むことができますが、直接にパスを使ってアクセスすることはできません。
    他のAPPによって作成された非メディアファイルは読み取り不可です。
    Downloads
    APPが自分で作成したファイルを読むことができますが、直接にパスを使ってアクセスすることはできません。
    他のAPPによって作成された非メディアファイルは読み取り不可です。
    続いてAndroid dQメモリについて具体的な機能について紹介しますので、ご注意ください。
    以上が本文の全部です。皆さんの勉強に役に立つように、私たちを応援してください。