安卓开发(六):拍照后将图片显示在ImageView中

实现此功能思路:调用相机拍照,然后把照片存储在固定路径,在去读取路径的照片。
先配置权限,在AndroidManifest.xml中配置读写权限

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"></uses-permission>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>

1.打开相机的代码

 Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");
 imageUri=Uri.fromFile(new File(path));
 intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
 startActivityForResult(intent, 1);

其中path为拍照后的存储路径,1为拍照后的返回值。
2.拍照后返回结果,核心代码

 Bitmap bitmap= BitmapFactory.decodeFile(path);
 imageView.setImageBitmap(bitmap);

这里用Bitmap来传递图片,可能会出现图片太大无法传输的情况,在AndroidManifest.xml的application中加上

android:hardwareAccelerated="false"

3.在安卓7.0上加上这段代码可正常运行

//android 7.0系统解决拍照的问题
        StrictMode.VmPolicy.Builder builder = new StrictMode.VmPolicy.Builder();
        StrictMode.setVmPolicy(builder.build());
        builder.detectFileUriExposure();

动态申请权限

if (Build.VERSION.SDK_INT >= 23) {
            int REQUEST_CODE_CONTACT = 101;
            String[] permissions = {Manifest.permission.READ_CONTACTS,Manifest.permission.WRITE_CONTACTS,//联系人的权限
                    Manifest.permission.READ_EXTERNAL_STORAGE,Manifest.permission.WRITE_EXTERNAL_STORAGE};//读写SD卡权限
            //验证是否许可权限
            for (String str : permissions) {
                if (this.checkSelfPermission(str) != PackageManager.PERMISSION_GRANTED) {
                    //申请权限
                    this.requestPermissions(permissions, REQUEST_CODE_CONTACT);
                }
            }
        }

以下为完整代码
MainActivity

public class MainActivity extends AppCompatActivity {
    Uri imageUri;
    Button btn;
    ImageView imageView;
    String path= Environment.getExternalStorageDirectory()+File.separator+"DCIM"+File.separator+"Camera"+File.separator+"temp.jpg";
    @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2)
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        imageView=findViewById(R.id.iv_selected);
        btn=findViewById(R.id.btn_camera);
        Permission();
        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                openCarema();
            }
        });
    }

    /**
     * 打开相机
     */
    private void openCarema() {
        //启动相机程序
        Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");
        imageUri=Uri.fromFile(new File(path));
        intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
        startActivityForResult(intent, 1);
    }
    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
            switch (requestCode) {
                case 1:
                    try{
                        Bitmap bitmap= BitmapFactory.decodeFile(path);
                        imageView.setImageBitmap(bitmap);
                    }catch (Exception e){e.printStackTrace();}

                    break;
            }
    }
    public void Permission(){
        //安卓7.0调用相机
        StrictMode.VmPolicy.Builder builder = new StrictMode.VmPolicy.Builder();
        StrictMode.setVmPolicy(builder.build());
        builder.detectFileUriExposure();

        //动态申请权限
        if (Build.VERSION.SDK_INT >= 23) {
            int REQUEST_CODE_CONTACT = 101;
            String[] permissions = {Manifest.permission.READ_CONTACTS,Manifest.permission.WRITE_CONTACTS,//联系人的权限
                    Manifest.permission.READ_EXTERNAL_STORAGE,Manifest.permission.WRITE_EXTERNAL_STORAGE};//读写SD卡权限
            //验证是否许可权限
            for (String str : permissions) {
                if (this.checkSelfPermission(str) != PackageManager.PERMISSION_GRANTED) {
                    //申请权限
                    this.requestPermissions(permissions, REQUEST_CODE_CONTACT);
                }
            }
        }
    }
}

Xml文件:

<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"
    tools:context=".MainActivity">
    <LinearLayout
        android:id="@+id/bottombar1"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true" >

        <Button
            android:id="@+id/btn_camera"
            android:layout_weight="4"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:text="拍照" />
    </LinearLayout>

    <RelativeLayout
        android:id="@+id/bottombar"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_above="@id/bottombar1"
        >

        <RadioGroup
            android:id="@+id/radiogroup"
            android:layout_width="wrap_content"
            android:layout_height="50dp"
            android:layout_alignParentLeft="true"
            android:orientation="horizontal" />

    </RelativeLayout>

    <ScrollView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_above="@id/bottombar"
        android:layout_alignParentTop="true" >

        <LinearLayout
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:focusable="true"
            android:focusableInTouchMode="true"
            android:orientation="vertical" >

            <LinearLayout
                android:focusable="true"
                android:focusableInTouchMode="true"
                android:layout_width="0px"
                android:layout_height="0px"/>

            <TextView
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:text="选取的图片:" />

            <ImageView
                android:id="@+id/iv_selected"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:adjustViewBounds="true"
                android:maxHeight="300dp" />
        </LinearLayout>
    </ScrollView>

</RelativeLayout>
  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
实现这个功能需要以下几个步骤: 1. 添加相机权限和读写外部存储权限到AndroidManifest.xml文件 ``` <uses-permission android:name="android.permission.CAMERA"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> ``` 2. 在布局文件添加一个ImageView用于显示照片,一个EditText用于输入文字,一个Button用于拍照和保存照片 ``` <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <ImageView android:id="@+id/imageView" android:layout_width="match_parent" android:layout_height="match_parent" android:scaleType="centerCrop"/> <EditText android:id="@+id/editText" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:padding="16dp"/> <Button android:id="@+id/button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Take Photo" android:layout_above="@id/editText" android:layout_centerHorizontal="true"/> </RelativeLayout> ``` 3. 在Activity实现拍照逻辑: 首先,定义一个变量用于存储照片路径,然后在onCreate方法初始化相机和图片存储路径: ``` private String photoPath; private static final int REQUEST_IMAGE_CAPTURE = 1; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // Initialize camera and photo path File photoFile = null; try { photoFile = createImageFile(); } catch (IOException ex) { // Error occurred while creating the File ex.printStackTrace(); } if (photoFile != null) { photoPath = photoFile.getAbsolutePath(); Uri photoURI = FileProvider.getUriForFile(this, "com.example.android.fileprovider", photoFile); Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI); if (takePictureIntent.resolveActivity(getPackageManager()) != null) { startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE); } } } // Create a unique file name for the photo private File createImageFile() throws IOException { // Create an image file name String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date()); String imageFileName = "JPEG_" + timeStamp + "_"; File storageDir = getExternalFilesDir(Environment.DIRECTORY_PICTURES); File image = File.createTempFile( imageFileName, /* prefix */ ".jpg", /* suffix */ storageDir /* directory */ ); // Save a file: path for use with ACTION_VIEW intents return image; } ``` 接着,在onActivityResult方法获取拍摄的照片并显示ImageView: ``` @Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == RESULT_OK) { Bitmap bitmap = BitmapFactory.decodeFile(photoPath); ImageView imageView = findViewById(R.id.imageView); imageView.setImageBitmap(bitmap); } } ``` 最后,在Button的点击事件获取EditText的文本内容并添加到图片上,然后保存到Room数据库并更新RecyclerView: ``` private AppDatabase db; private List<Photo> photoList; private PhotoAdapter adapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // Initialize database and RecyclerView db = Room.databaseBuilder(getApplicationContext(), AppDatabase.class, "photo-database").build(); photoList = new ArrayList<>(); adapter = new PhotoAdapter(photoList); RecyclerView recyclerView = findViewById(R.id.recyclerView); recyclerView.setLayoutManager(new LinearLayoutManager(this)); recyclerView.setAdapter(adapter); // Set button click listener Button button = findViewById(R.id.button); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { EditText editText = findViewById(R.id.editText); String text = editText.getText().toString(); Bitmap bitmap = BitmapFactory.decodeFile(photoPath); Bitmap newBitmap = addTextToBitmap(bitmap, text); saveToDatabase(newBitmap); updateRecyclerView(); editText.setText(""); } }); } // Add text to the bottom of the bitmap private Bitmap addTextToBitmap(Bitmap bitmap, String text) { Bitmap newBitmap = bitmap.copy(Bitmap.Config.ARGB_8888, true); Canvas canvas = new Canvas(newBitmap); Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG); paint.setColor(Color.WHITE); paint.setTextSize(48); paint.setTextAlign(Paint.Align.CENTER); Rect bounds = new Rect(); paint.getTextBounds(text, 0, text.length(), bounds); int x = canvas.getWidth() / 2; int y = canvas.getHeight() - bounds.height() - 64; canvas.drawText(text, x, y, paint); return newBitmap; } // Save the photo to database private void saveToDatabase(Bitmap bitmap) { ByteArrayOutputStream stream = new ByteArrayOutputStream(); bitmap.compress(Bitmap.CompressFormat.JPEG, 100, stream); byte[] bytes = stream.toByteArray(); Photo photo = new Photo(bytes); db.photoDao().insert(photo); } // Update the RecyclerView with new data from database private void updateRecyclerView() { photoList.clear(); photoList.addAll(db.photoDao().getAll()); adapter.notifyDataSetChanged(); } ``` 完整的代码可以在GitHub上查看:https://github.com/guolindev/Android-Camera-Room。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ewind927

如果觉得有用,可以请我喝奶茶

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值