主要思路:调用照相机拍照,然后为拍得的照片在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;
}