AndroidはViewをスクリーンショットしてローカルアルバムに保存

20215 ワード

ビューのスクリーンショット
特定の場合はビューをスクリーンショットし、ビューのgetDrawingCache()メソッドを使用してBitmapオブジェクトを返すと、スクリーンショットの機能が実現します.
コードは次のとおりです.
private Bitmap testViewSnapshot(View view) {
     
        //         
        view.setDrawingCacheEnabled(true);
        //      Bitmap
        Bitmap drawingCache = view.getDrawingCache();
        //      Bitmap
        drawingCache = Bitmap.createBitmap(drawingCache);
        //       
        view.setDrawingCacheEnabled(false);

        return  drawingCache;
    }

このビューは任意のコントロールで、スクリーンショットが簡単なのではないでしょうか.では、次はBitmapをアルバムに保存します.
Bitmapをローカルに保存
主な手順ここでは、「保存」を押した後、Bitmapオブジェクトをピクチャファイルとして保存する方法についてのみ説明します.ピクチャのダウンロード、ピクチャからBitmapオブジェクトへの変換、Bitmapオブジェクトのフォーマット変換と圧縮、インタフェース設計部分はすべて無視されます.
  • は、記憶パス
  • を決定する.
  • 外部記憶権限
  • を取得する.
  • ファイル名
  • を決定
  • ファイルに保存する
  • 放送、
  • は、保存後のファイルをスキャンする記憶パス
  • をシステムに通知する.
    1.ストレージパスの決定
    現在、ほとんどのアプリケーションでは、共有する必要があるファイルを格納するために、外部に格納されているルートパスの下にパッケージ名のような多層ディレクトリが作成されています.たとえば/storage/emulated/0/sogou/image/です.Androidシステムの断片化の問題で、デバイスによって外部ストレージのパスが異なる可能性が高いため、/storage/emulated/0/を外部ストレージのルートパスとして直接使用することはできません.
    Android SDKのEnvironmentクラスでは、外部ストレージのルートパスを取得するためのgetExternalStorageDirectory()メソッドが用意されています.例は次のとおりです.
     //            
      File file = new File( Environment.getExternalStorageDirectory(),"/Meet/");
      //               
        if(!file.exists()){
         
            file.mkdirs();
        }
    

    注意しなければならないのはEnvironmentです.getExternalStorageDirectory()が返すパスの最後の文字は/ではありません.サブディレクトリを作成する必要がある場合は、サブディレクトリの前後に/を付ける必要があります.
    2.外部ストレージ権限の取得
    外部ストレージにファイルを書く必要があるため、AndroidManifest.xmlに次の権限宣言を追加します.
       <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>  
       <!-- sdcard   /        -->
    	<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"
    	tools:ignore="ProtectedPermissions" />
    

    3.ファイル名の決定
    画像を保存するたびに名前が違うことを確認するために、ここではSystemを使用します.CurrentTimeMillis()は、画像の名前を付けます.
    File path =  new File(file,System.currentTimeMillis()+".png");
    

    4.ファイルに保存
    画像ファイルを保存する場合は、Bitmapのcompress()メソッドでBitmapオブジェクトをファイル出力ストリームに圧縮し、flush()を使用します.例は以下のとおりです.
    FileOutputStream fileOutputStream = new FileOutputStream(path);
     // compress -         bitmap        
     bitmap.compress(Bitmap.CompressFormat.PNG, 80, fileOutputStream);
     //              
     fileOutputStream.flush();
     fileOutputStream.close();
    

    これにより、Bitmapオブジェクトを外部記憶のpng形式のファイルとして保存することが実現された.ただし、このファイルは外部に格納されているディレクトリにのみ保存され、そのディレクトリに入る必要があります.システムギャラリー、アルバム、その他のアプリケーションでは、新しい画像ファイルは表示されません.他のアプリケーションがピクチャファイルが作成されたことを知るためには、MediaProviderサービスに新しいファイルをピクチャデータベースに追加するように通知する必要があります.
    AndroidシステムにはMediaProviderサービスが常駐しており、対応するプロセス名はandroidである.process.Media、このサービスは、ホスト上のメディアファイルを管理し、メディア管理サービスを提供するために使用されます.システムの電源を入れたり、外部に格納されているマウントメッセージを受信したりすると、MediaProviderはMediaScannerを呼び出し、MediaScannerは外部に格納されているすべてのファイルをスキャンし、ファイルタイプの接尾辞に基づいてファイル情報を対応するデータベースに保存し、他のAPPで使用します.
    MediaScannerReceiverは、特定のブロードキャストリクエストを受信すると、指定したファイルをスキャンし、ファイル情報に基づいてデータベースに追加するブロードキャスト受信者です.画像ファイルが作成されると、MediaScannerReceiverにブロードキャストを送信し、新しい画像ファイルのスキャンを通知することができます.例は以下のとおりです.
    ブロードキャスト&通知システムスキャン保存後のファイル決定ストレージパス
    //                
     Uri uri = Uri.fromFile(path);
      Intent intent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
      intent.setData(uri);
      sendBroadcast(intent);
    

    これで、画像をローカルファイルに保存することに成功し、保存された画像をアルバムに表示することができます.
    完全なコードは次のとおりです.
    
    //         
    private void clickDownload() {
         
        ll_download.setOnClickListener(new View.OnClickListener() {
         
            @Override
            public void onClick(View v) {
         
                Bitmap bitmap = testViewSnapshot(ll_content);
                // bitMap      
                saveBitmap(bitmap);
            }
        });
        }
    
    // View           
    private Bitmap testViewSnapshot(View view) {
         
            //         
            view.setDrawingCacheEnabled(true);
            //      Bitmap
            Bitmap drawingCache = view.getDrawingCache();
            //      Bitmap
            drawingCache = Bitmap.createBitmap(drawingCache);
            //       
            view.setDrawingCacheEnabled(false);
    
            return  drawingCache;
        }
    
    
    //  BitMap       
    private void saveBitmap(Bitmap bitmap) {
         
            //            
            File file = new File( Environment.getExternalStorageDirectory(),"/Meet/");
            //               
            if(!file.exists()){
         
                file.mkdirs();
            }
            File path =  new File(file,System.currentTimeMillis()+".png");
            try {
         
                FileOutputStream fileOutputStream = new FileOutputStream(path);
                // compress -         bitmap        
                bitmap.compress(Bitmap.CompressFormat.PNG, 80, fileOutputStream);
                //              
                fileOutputStream.flush();
                fileOutputStream.close();
                //                
                Uri uri = Uri.fromFile(path);
                Intent intent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
                intent.setData(uri);
                sendBroadcast(intent);
                Toast.makeText(this, "    ", Toast.LENGTH_SHORT).show();
            } catch (FileNotFoundException e) {
         
                LogUtils.i("error:"+e.toString());
            } catch (IOException e) {
         
                LogUtils.i("error:"+e.toString());
            }
            LogUtils.i(path.getPath());
        }
    

    ここでは主なコードのみが与えられ、ボタンのクリックとそのViewのスクリーンショットを変更するだけで使用できる.