今天業(yè)務(wù)提出需求說垮庐,app調(diào)用系統(tǒng)相機(jī)拍出的照片松邪,在相冊里可以看到∩诓椋考慮到安全性逗抑,業(yè)務(wù)說拍出的照片,不應(yīng)該讓用戶看到寒亥。思考了一下邮府, 我決定創(chuàng)建一個(gè)隱藏文件夾,用戶看不到照片內(nèi)容溉奕。
先看效果(這里在手機(jī)內(nèi)存里創(chuàng)建了一個(gè)名為yangliu的文件夾褂傀,文件夾里包含另一個(gè)叫picture的文件夾,文件夾里是用戶拍的照片):
Android創(chuàng)建隱藏文件或者文件夾加勤,并對(duì)其讀寫操作仙辟。android創(chuàng)建隱藏文件或者文件夾,其實(shí)只要在文件名或者文件夾名字前加一個(gè)點(diǎn)號(hào)即可鳄梅。 隱藏的文件(夾)可直接進(jìn)行讀寫叠国。 下面帶來代碼片段:
MainActivity代碼
package com.e_valmont.look_lookdemo;
import android.content.Intent;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.Toast;
import java.io.File;
import java.text.SimpleDateFormat;
import java.util.Date;
public class MainActivity extends AppCompatActivity {
private static final String TAG = "MainActivity";
private Button cameraButton;//照相按鈕
private ImageView photoImageView;//顯示相片
private static final int REQUEST_CODE = 1;
private String strImgPath = "";//照片保存路徑
private File imageFile = null;//照片文件
/** 定義相片的最大尺寸 **/
private final int IMAGE_MAX_WIDTH = 540;
private final int IMAGE_MAX_HEIGHT = 960;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
iniView();
cameraButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent getPhoto = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
strImgPath = Environment.getExternalStorageDirectory().toString() + "/yangliu/picture/";//文件夾名字,在文件夾前加".",就可以隱藏文件夾
//strImgPath = Environment.getExternalStorageDirectory().toString() + "/yangliu/.picture/";//隱藏文件夾代碼,已注釋
String fileName = new SimpleDateFormat("yyyyMMddHHmmss").format(new Date()) + ".jpg";// 照片以格式化日期方式命名戴尸,在照片前加".",就可以隱藏照片粟焊。eg:20170420182400.jpg
//String fileName = "."+new SimpleDateFormat("yyyyMMddHHmmss").format(new Date()) + ".jpg";//隱藏照片代碼,已注釋
File out = new File(strImgPath);
if (!out.exists()) {
out.mkdirs();
}
out = new File(strImgPath, fileName);
strImgPath = strImgPath + fileName;// 該照片的絕對(duì)路徑
Uri uri = Uri.fromFile(out);
getPhoto.putExtra(MediaStore.EXTRA_OUTPUT, uri);//根據(jù)uri保存照片
getPhoto.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 1);//保存照片的質(zhì)量
startActivityForResult(getPhoto, REQUEST_CODE);//啟動(dòng)相機(jī)拍照
}
});
}
/**
* 視圖初始化
*/
private void iniView() {
cameraButton = (Button) findViewById(R.id.take_photo);
photoImageView = (ImageView) findViewById(R.id.photo_view);
}
/**
* 返回照片結(jié)果處理
*/
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == RESULT_OK && requestCode == REQUEST_CODE) {
imageFile = new File(strImgPath);
int scale = 0;
scale = getZoomScale(imageFile);//得到縮放倍數(shù)
Log.i(TAG, "scale = "+scale);
BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = scale;
photoImageView.setImageBitmap(BitmapFactory.decodeFile(strImgPath,options));//按指定options顯示圖片防止OOM
}else {
Toast.makeText(MainActivity.this,"失敗", Toast.LENGTH_LONG).show();
}
}
/**
* 圖片縮放處理
* @param imageFile 照片文件
* @return 縮放的倍數(shù)
*/
private int getZoomScale(File imageFile) {
int scale = 1;
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeFile(strImgPath, options);
while (options.outWidth / scale >= IMAGE_MAX_WIDTH || options.outHeight / scale >= IMAGE_MAX_HEIGHT) {
scale *= 2;
}
return scale;
}
}
activity_main.xml代碼(很簡單孙蒙,一個(gè)拍照按鈕项棠,一個(gè)imageView來顯示照片)
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" >
<Button
android:id="@+id/take_photo"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:text="Button" />
<ImageView
android:id="@+id/photo_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:layout_marginTop="140dp"
android:src="@mipmap/ic_launcher" />
</RelativeLayout>
布局效果圖:
代碼已測試,拍過的照片確實(shí)在本地找不到马篮。但是這也會(huì)造成一個(gè)現(xiàn)象:用戶找不到占內(nèi)存的文件夾沾乘,所以無法清理,導(dǎo)致內(nèi)存越來越大浑测。所以也需要定時(shí)清理這個(gè)文件夾翅阵,或者當(dāng)用戶不需要這個(gè)照片時(shí)歪玲,可以做些清除操作。
如果這個(gè)文章對(duì)你有用掷匠,請收藏或喜歡滥崩,如果能加一下關(guān)注,那就更好了讹语!