主要思路:调用照相机拍照,然后为拍得的照片在SD卡新开一个储存照片的文件,然后在onActivityResult中进行照片显示
1、因为要调用照相机和SD卡所以需要在manifest.xml中添加以下权限:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<!--获取sd卡写的权限,用于文件上传和下载-->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.CAMERA" />
如果app只运行在6.0以下系统的手机,只需要在manifest.xml中添加权限即可。
如果app也需要运行在6.0及以上系统的手机,那么除了在manifest.xml中添加权限外,还需要动态获取权限。动态请求权限的具体操作,百度即可。
2、布局文件
<LinearLayout
android:layout_width="match_parent"
android:layout_height="@dimen/view_height_70"
android:background="@color/white"
android:orientation="horizontal">
<ImageView
android:id="@+id/iv_btn_camera"
android:layout_width="@dimen/view_width_60"
android:layout_height="@dimen/view_height_60"
android:layout_gravity="center_vertical"
android:src="@drawable/icon_add_pic_80" />
<ImageView
android:id="@+id/iv_showPic"
android:layout_width="@dimen/view_width_60"
android:layout_height="@dimen/view_height_60" />
</LinearLayout>
3、Activity类
public class EditBookActivity extends BaseActivity {
private ImageView iv_btn_camera;
public static final int REQUEST_CODE = 10;
private File file1 = null;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_add_order_parent);
initElement();
setElement();
}
/**
* 初始化控件
*/
private void initElement() {
iv_btn_camera = (ImageView) findViewById(R.id.iv_btn_camera);
}
/**
* 配置控件
*/
private void setElement() {
iv_btn_camera.setOnClickListener(onClickListener);
}
/**
* 控件点击事件
*/
private View.OnClickListener onClickListener = new View.OnClickListener() {
@Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.iv_btn_camera:
if (ContextCompat.checkSelfPermission(EditBookActivity.this, Manifest.permission.CAMERA)
!= PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(EditBookActivity.this
, new String[]{Manifest.permission.CAMERA}, 1);
} else {
String state = Environment.getExternalStorageState();
if (state.equals(Environment.MEDIA_MOUNTED)) {
String appName = getAppName(EditBookActivity.this);
String path = Environment.getExternalStorageDirectory().getPath();
File file = new File(path + "/" + appName);
if (!file.exists()) {
if (!file.mkdirs()) {
Toast.makeText(EditBookActivity.this, "创建目录失败!", Toast.LENGTH_SHORT).show();
}
}
file1 = new File(file.getAbsolutePath(), "/" + "服饰" + ".jpg");
Uri uri = getUriForFile(EditBookActivity.this, file1);
Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");
intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
startActivityForResult(intent, 1);
} else {
Toast.makeText(EditBookActivity.this, "未找到存储卡!", Toast.LENGTH_SHORT).show();
}
}
break;
default:
break;
}
}
};
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == RESULT_OK && requestCode == 1) {
BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = 2;
options.inJustDecodeBounds = false;
Bitmap bmp = BitmapFactory.decodeFile(file1.getAbsolutePath(), options);
iv_showPic.setImageBitmap(bmp);
iv_showPic.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
try {
Uri u = Uri.parse(MediaStore.Images.Media.insertImage(getContentResolver(),
file1.getAbsolutePath(), null, null));
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(u);
startActivity(intent);
} catch (FileNotFoundException e) {
Toast.makeText(MemberMainActivity.this, "文件未找到!", Toast.LENGTH_SHORT).show();
}
}
});
}
}
/**
* 启动EditBookActivity
*
* @param context 上下文
*/
public static void startActivity(Context context) {
Intent intent = new Intent();
intent.setClass(context, EditBookActivity.class);
context.startActivity(intent);
}
/**
* 请求权限后处理
*
* @param requestCode 请求code
* @param permissions 权限
* @param grantResults 返回结果
*/
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
switch (requestCode) {
case 1:
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
String state = Environment.getExternalStorageState();
if (state.equals(Environment.MEDIA_MOUNTED)) {
String appName = getAppName(EditBookActivity.this);
String path = Environment.getExternalStorageDirectory().getPath();
File file = new File(path + "/" + appName);
if (!file.exists()) {
if (!file.mkdirs()) {
Toast.makeText(EditBookActivity.this, "创建目录失败!", Toast.LENGTH_SHORT).show();
}
}
file1 = new File(file.getAbsolutePath(), "/" + "服饰" + ".jpg");
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(file1));
startActivityForResult(intent, 1);
} else {
Toast.makeText(EditBookActivity.this, "未找到存储卡!", Toast.LENGTH_SHORT).show();
}
} else {
Toast.makeText(this, "开通权限失败,请前往设置开通权限", Toast.LENGTH_SHORT).show();
}
break;
default:
break;
}
}
@Override
protected void onRestart() {
super.onRestart();
}
@Override
protected void onDestroy() {
super.onDestroy();
if (file1 != null) {
if (file1.exists()) {
file1.delete();
}
}
}
}
4、getAppName()方法
/**
* 获取App名
*
* @param context 上下文
* @return appName
*/
public static String getAppName(Context context) {
String label = null;
try {
PackageManager packageManager = context.getPackageManager();
ApplicationInfo applicationInfo = packageManager.getApplicationInfo(context.getPackageName(), 0);
label = packageManager.getApplicationLabel(applicationInfo).toString();
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
return label;
}