android 將view生成圖片後保存到本地相冊的實現


public class RecommendCodeActivity extends BaseActivity {
    private ImageView ivCode;
    String codeUrl = "";
    private int codeId = 0;
    private TextView tvId, tvSave;
    private LinearLayout llMain;
    private TextView mTvRight;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_recommend_code);
        mLDialog.show();
        findViews();
        initData(savedInstanceState);
        sendRecommendCode();
        initViews(savedInstanceState);
    }


    @Override
    protected void findViews() {
        ivCode = findViewById(R.id.iv_code);
        tvId = findViewById(R.id.tv_id);
        llMain = findViewById(R.id.ll_main);
        tvSave = findViewById(R.id.tv_save);
    }

    @Override
    protected void initViews(Bundle savedInstanceState) {
        tvSave.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                tvSave.setClickable(false);

//相關權限的申請 存儲權限

                try {
                    if (ActivityCompat.checkSelfPermission(RecommendCodeActivity.this, Manifest.permission.READ_EXTERNAL_STORAGE)
                            != PackageManager.PERMISSION_GRANTED
                            || ActivityCompat.checkSelfPermission(RecommendCodeActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE)
                            != PackageManager.PERMISSION_GRANTED) {
                        // 申請一個(或多個)權限,並提供用於回調返回的獲取碼(用戶定義)
                        ActivityCompat.requestPermissions(RecommendCodeActivity.this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1);
                    } else {
                        mLDialog.setDialogText("正在保存圖片...");
                        mLDialog.show();
                        saveMyBitmap("AuthCode", createViewBitmap(llMain));
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

//權限申請的回調
    @Override
    public void onRequestPermissionsResult(int requestCode,
                                           String permissions[], int[] grantResults) {
        switch (requestCode) {
            case 1: {
                // If request is cancelled, the result arrays are empty.
                if (grantResults.length > 0
                        && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    mLDialog.setDialogText("正在保存圖片...");
                    mLDialog.show();
                    try {
                        saveMyBitmap("AuthCode", createViewBitmap(llMain));
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                } else {
                    tvSave.setClickable(true);
                    Toast.makeText(RecommendCodeActivity.this, "請先開啓讀寫權限", Toast.LENGTH_SHORT).show();
                }
                return;
            }
        }
    }

//使用IO流將bitmap對象存到本地指定文件夾
    public void saveMyBitmap(final String bitName, final Bitmap bitmap) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                String filePath = Environment.getExternalStorageDirectory().getPath();
                File file = new File(filePath + "/DCIM/Camera/" + bitName + ".png");
                try {
                    file.createNewFile();


                    FileOutputStream fOut = null;
                    fOut = new FileOutputStream(file);
                    bitmap.compress(Bitmap.CompressFormat.PNG, 100, fOut);


                    Message msg = Message.obtain();
                    msg.obj = file.getPath();
                    handler.sendMessage(msg);
                    //Toast.makeText(PayCodeActivity.this, "保存成功", Toast.LENGTH_LONG).show();
                    fOut.flush();
                    fOut.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }).start();
    }


    Handler handler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            String picFile = (String) msg.obj;
            String[] split = picFile.split("/");
            String fileName = split[split.length - 1];
            try {
                MediaStore.Images.Media.insertImage(getApplicationContext()
                        .getContentResolver(), picFile, fileName, null);
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            }
            // 最後通知圖庫更新
            sendBroadcast(new Intent(
                    Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.parse("file://"
                    + picFile)));
            Toast.makeText(RecommendCodeActivity.this, "圖片保存圖庫成功", Toast.LENGTH_LONG).show();
            if (mLDialog != null && mLDialog.isShowing()) {
                mLDialog.dismiss();
            }
            tvSave.setClickable(true);
        }
    };


//將要存爲圖片的view傳進來 生成bitmap對象

    public Bitmap createViewBitmap(View v) {
        Bitmap bitmap = Bitmap.createBitmap(v.getWidth(), v.getHeight(),
                Bitmap.Config.ARGB_8888);
        Canvas canvas = new Canvas(bitmap);
        v.draw(canvas);
        return bitmap;
    }

    @Override
    protected void initData(Bundle savedInstanceState) {


    }

    @Override
    protected String initTitleCenterString() {
        return "推薦碼";
    }

}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章