首页 文章

从相机中捕获图像并在活动中显示

提问于
浏览
236

我想写一个模块,只需点击按钮,相机就会打开,我可以点击并捕捉图像 . 如果我不喜欢图像,我可以将其删除并再单击一个图像,然后选择图像,它应该返回并在活动中显示该图像 .

12 回答

  • 0

    这是完整的代码:

    package com.example.cameraa;
    import android.app.Activity;
    import android.content.Intent;
    import android.graphics.Bitmap;
    import android.net.Uri;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.Button;
    import android.widget.ImageView;
    
    public class MainActivity extends Activity {
    
    
    
    
            Button btnTackPic;
            Uri photoPath;
            ImageView ivThumbnailPhoto;
    
            static int TAKE_PICTURE = 1;
    
            @Override
            protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_main);
    
                // Get reference to views
    
                btnTackPic = (Button) findViewById(R.id.bt1);
                ivThumbnailPhoto = (ImageView) findViewById(R.id.imageView1);
    
    
    
    
         btnTackPic.setOnClickListener(new View.OnClickListener() {
    
            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
    
    
                    Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); 
                    startActivityForResult(cameraIntent, TAKE_PICTURE); 
                }
    
    
    
    
        });
    
            } 
    
            @Override
            protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
    
    
                    if (requestCode == TAKE_PICTURE && resultCode == RESULT_OK) {  
                        Bitmap photo = (Bitmap)intent.getExtras().get("data"); 
                       ivThumbnailPhoto.setImageBitmap(photo);
                    ivThumbnailPhoto.setVisibility(View.VISIBLE);
    
    
    
                }
            }
    }
    

    请记住也要为相机添加权限 .

  • 3

    这是一个示例活动,它将启动相机应用程序,然后检索图像并显示它 .

    package edu.gvsu.cis.masl.camerademo;
    
    import android.app.Activity;
    import android.content.Intent;
    import android.graphics.Bitmap;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.Button;
    import android.widget.ImageView;
    
    public class MyCameraActivity extends Activity {
        private static final int CAMERA_REQUEST = 1888; 
        private ImageView imageView;
        private static final int MY_CAMERA_PERMISSION_CODE = 100;
    
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
            this.imageView = (ImageView)this.findViewById(R.id.imageView1);
            Button photoButton = (Button) this.findViewById(R.id.button1);
            photoButton.setOnClickListener(new View.OnClickListener() {
    
                @Override
                public void onClick(View v) {
                   if (checkSelfPermission(Manifest.permission.CAMERA)
                            != PackageManager.PERMISSION_GRANTED) {
                   requestPermissions(new String[]{Manifest.permission.CAMERA},
                                MY_CAMERA_PERMISSION_CODE);
                    } else {
                    Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); 
                    startActivityForResult(cameraIntent, CAMERA_REQUEST);
                    } 
                }
            });
        }
    
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if (requestCode == MY_CAMERA_PERMISSION_CODE) {
               if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    Toast.makeText(this, "camera permission granted", Toast.LENGTH_LONG).show();
                    Intent cameraIntent = new 
    Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); 
                    startActivityForResult(cameraIntent, CAMERA_REQUEST);
                      } else {
                   Toast.makeText(this, "camera permission denied", Toast.LENGTH_LONG).show();
                 }
    
           }
    
        protected void onActivityResult(int requestCode, int resultCode, Intent data) {  
            if (requestCode == CAMERA_REQUEST && resultCode == Activity.RESULT_OK) {  
                Bitmap photo = (Bitmap) data.getExtras().get("data"); 
                imageView.setImageBitmap(photo);
            }  
        } 
    }
    

    请注意,相机应用程序本身使您能够查看/重新拍摄图像,一旦图像被接受,活动就会显示它 .

    以下是上述活动使用的布局 . 它只是一个LinearLayout,包含一个带有按钮1的按钮和一个带有id imageview1的ImageView:

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        >
        <Button android:id="@+id/button1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/photo"></Button>
        <ImageView android:id="@+id/imageView1" android:layout_height="wrap_content" android:src="@drawable/icon" android:layout_width="wrap_content"></ImageView>
    
    </LinearLayout>
    

    最后一个细节,一定要补充:

    <uses-feature android:name="android.hardware.camera"></uses-feature>
    

    如果相机是您的应用功能的可选项 . 确保在权限中将require设置为false . 像这样

    <uses-feature android:name="android.hardware.camera" android:required="false"></uses-feature>
    

    到您的manifest.xml .

  • 418

    我需要几个小时才能完成这项工作 . 它几乎是developer.android.com的复制粘贴代码,略有不同 .

    AndroidManifest.xml 上申请此权限:

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

    Activity 上,首先定义:

    static final int REQUEST_IMAGE_CAPTURE = 1;
    private Bitmap mImageBitmap;
    private String mCurrentPhotoPath;
    private ImageView mImageView;
    

    然后在 onClick 中解雇 Intent

    Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    if (cameraIntent.resolveActivity(getPackageManager()) != null) {
        // Create the File where the photo should go
        File photoFile = null;
        try {
            photoFile = createImageFile();
        } catch (IOException ex) {
            // Error occurred while creating the File
            Log.i(TAG, "IOException");
        }
        // Continue only if the File was successfully created
        if (photoFile != null) {
            cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(photoFile));
            startActivityForResult(cameraIntent, REQUEST_IMAGE_CAPTURE);
        }
    }
    

    添加以下支持方法:

    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 = Environment.getExternalStoragePublicDirectory(
                Environment.DIRECTORY_PICTURES);
        File image = File.createTempFile(
                imageFileName,  // prefix
                ".jpg",         // suffix
                storageDir      // directory
        );
    
        // Save a file: path for use with ACTION_VIEW intents
        mCurrentPhotoPath = "file:" + image.getAbsolutePath();
        return image;
    }
    

    然后收到结果:

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == RESULT_OK) {
            try {
                mImageBitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(), Uri.parse(mCurrentPhotoPath));
                mImageView.setImageBitmap(mImageBitmap);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    

    使它工作的是 MediaStore.Images.Media.getBitmap(this.getContentResolver(), Uri.parse(mCurrentPhotoPath)) ,它与developer.android.com的代码不同 . 原始代码给了我一个 FileNotFoundException .

  • 4

    拍摄照片从图库中选择:

    a = (ImageButton)findViewById(R.id.imageButton1);
    
            a.setOnClickListener(new View.OnClickListener() {
    
                @Override
    
                public void onClick(View v) {
    
                    selectImage();
    
                }
    
            });
        }
        private File savebitmap(Bitmap bmp) {
          String extStorageDirectory = Environment.getExternalStorageDirectory().toString();
          OutputStream outStream = null;
         // String temp = null;
            File file = new File(extStorageDirectory, "temp.png");
          if (file.exists()) {
           file.delete();
           file = new File(extStorageDirectory, "temp.png");
    
          }
    
          try {
           outStream = new FileOutputStream(file);
           bmp.compress(Bitmap.CompressFormat.PNG, 100, outStream);
           outStream.flush();
           outStream.close();
    
          } catch (Exception e) {
           e.printStackTrace();
           return null;
          }
          return file;
         }
        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            // Inflate the menu; this adds items to the action bar if it is present.
            getMenuInflater().inflate(R.menu.main, menu);
            return true;
        }
         private void selectImage() {
    
    
    
                final CharSequence[] options = { "Take Photo", "Choose from Gallery","Cancel" };
    
    
    
                AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
    
                builder.setTitle("Add Photo!");
    
                builder.setItems(options, new DialogInterface.OnClickListener() {
    
                    @Override
    
                    public void onClick(DialogInterface dialog, int item) {
    
                        if (options[item].equals("Take Photo"))
    
                        {
    
                            Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    
                            File f = new File(android.os.Environment.getExternalStorageDirectory(), "temp.jpg");
    
                            intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(f));
                            //pic = f;
    
                            startActivityForResult(intent, 1);
    
    
                        }
    
                        else if (options[item].equals("Choose from Gallery"))
    
                        {
    
                            Intent intent = new   Intent(Intent.ACTION_PICK,android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
    
                            startActivityForResult(intent, 2);
    
    
    
                        }
    
                        else if (options[item].equals("Cancel")) {
    
                            dialog.dismiss();
    
                        }
    
                    }
    
                });
    
                builder.show();
    
            }
    
    
    
            @Override
    
            protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    
                super.onActivityResult(requestCode, resultCode, data);
    
                if (resultCode == RESULT_OK) {
    
                    if (requestCode == 1) {
                        //h=0;
                        File f = new File(Environment.getExternalStorageDirectory().toString());
    
                        for (File temp : f.listFiles()) {
    
                            if (temp.getName().equals("temp.jpg")) {
    
                                f = temp;
                                File photo = new File(Environment.getExternalStorageDirectory(), "temp.jpg");
                               //pic = photo;
                                break;
    
                            }
    
                        }
    
                        try {
    
                            Bitmap bitmap;
    
                            BitmapFactory.Options bitmapOptions = new BitmapFactory.Options();
    
    
    
                            bitmap = BitmapFactory.decodeFile(f.getAbsolutePath(),
    
                                    bitmapOptions); 
    
    
    
                            a.setImageBitmap(bitmap);
    
    
    
    
                            String path = android.os.Environment
    
                                    .getExternalStorageDirectory()
    
                                    + File.separator
    
                                    + "Phoenix" + File.separator + "default";
                            //p = path;
    
                            f.delete();
    
                            OutputStream outFile = null;
    
                            File file = new File(path, String.valueOf(System.currentTimeMillis()) + ".jpg");
    
                            try {
    
                                outFile = new FileOutputStream(file);
    
                                bitmap.compress(Bitmap.CompressFormat.JPEG, 85, outFile);
        //pic=file;
                                outFile.flush();
    
                                outFile.close();
    
    
                            } catch (FileNotFoundException e) {
    
                                e.printStackTrace();
    
                            } catch (IOException e) {
    
                                e.printStackTrace();
    
                            } catch (Exception e) {
    
                                e.printStackTrace();
    
                            }
    
                        } catch (Exception e) {
    
                            e.printStackTrace();
    
                        }
    
                    } else if (requestCode == 2) {
    
    
    
                        Uri selectedImage = data.getData();
                       // h=1;
        //imgui = selectedImage;
                        String[] filePath = { MediaStore.Images.Media.DATA };
    
                        Cursor c = getContentResolver().query(selectedImage,filePath, null, null, null);
    
                        c.moveToFirst();
    
                        int columnIndex = c.getColumnIndex(filePath[0]);
    
                        String picturePath = c.getString(columnIndex);
    
                        c.close();
    
                        Bitmap thumbnail = (BitmapFactory.decodeFile(picturePath));
    
    
                        Log.w("path of image from gallery......******************.........", picturePath+"");
    
    
                        a.setImageBitmap(thumbnail);
    
                    }
    
                }
    
  • 7

    我知道这是一个相当古老的线程,但是当用户旋转相机时,所有这些解决方案都没有完成并且在某些设备上不起作用,因为onActivityResult中的数据为空 . 所以这是我在很多设备上测试过的解决方案,到目前为止还没有遇到任何问题 .

    首先在您的活动中声明您的Uri变量:

    private Uri uriFilePath;
    

    然后创建临时文件夹以存储捕获的图像,并通过摄像头捕获图像的意图:

    PackageManager packageManager = getActivity().getPackageManager();
    if (packageManager.hasSystemFeature(PackageManager.FEATURE_CAMERA)) {
        File mainDirectory = new File(Environment.getExternalStorageDirectory(), "MyFolder/tmp");
             if (!mainDirectory.exists())
                 mainDirectory.mkdirs();
    
              Calendar calendar = Calendar.getInstance();
    
              uriFilePath = Uri.fromFile(new File(mainDirectory, "IMG_" + calendar.getTimeInMillis()));
              intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
              intent.putExtra(MediaStore.EXTRA_OUTPUT, uriFilePath);
              startActivityForResult(intent, 1);
    }
    

    现在这里有一个最重要的事情,你必须将你的uriFilePath保存在onSaveInstanceState中,因为如果你不这样做并且用户在使用相机时旋转了他的设备,那么你的uri将为空 .

    @Override
    protected void onSaveInstanceState(Bundle outState) {
         if (uriFilePath != null)
             outState.putString("uri_file_path", uriFilePath.toString());
         super.onSaveInstanceState(outState);
    }
    

    之后,您应该始终在onCreate方法中恢复您的uri:

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (savedInstanceState != null) {
             if (uriFilePath == null && savedInstanceState.getString("uri_file_path") != null) {
                 uriFilePath = Uri.parse(savedInstanceState.getString("uri_file_path"));
             }
        } 
    }
    

    最后一部分是让你的Uri进入onActivityResult:

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {    
        if (resultCode == RESULT_OK) {
             if (requestCode == 1) {
                String filePath = uriFilePath.getPath(); // Here is path of your captured image, so you can create bitmap from it, etc.
             }
        }
     }
    

    附:不要忘记为Camera和Ext添加权限 . 存储写入您的清单 .

  • 19

    你需要阅读Camera . (我想要做你想做的事,你必须将当前图像保存到你的应用程序,在那里进行选择/删除,然后再调用相机再试一次,而不是直接在相机内部重试 . )

  • 2

    这是我用于捕获和保存摄像机图像然后将其显示到imageview的代码 . 您可以根据自己的需要使用 .

    您必须将摄像机图像保存到特定位置,然后从该位置获取然后将其转换为字节数组 .

    这是用于打开捕获相机图像活动的方法 .

    private static final int CAMERA_PHOTO = 111;
    private Uri imageToUploadUri;
    
    private void captureCameraImage() {
            Intent chooserIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
            File f = new File(Environment.getExternalStorageDirectory(), "POST_IMAGE.jpg");
            chooserIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(f));
            imageToUploadUri = Uri.fromFile(f);
            startActivityForResult(chooserIntent, CAMERA_PHOTO);
        }
    

    那么你的onActivityResult()方法应该是这样的 .

    @Override
            protected void onActivityResult(int requestCode, int resultCode, Intent data) {
                super.onActivityResult(requestCode, resultCode, data);
    
                if (requestCode == CAMERA_PHOTO && resultCode == Activity.RESULT_OK) {
                    if(imageToUploadUri != null){
                        Uri selectedImage = imageToUploadUri;
                        getContentResolver().notifyChange(selectedImage, null);
                        Bitmap reducedSizeBitmap = getBitmap(imageToUploadUri.getPath());
                        if(reducedSizeBitmap != null){
                            ImgPhoto.setImageBitmap(reducedSizeBitmap);
                            Button uploadImageButton = (Button) findViewById(R.id.uploadUserImageButton);
                              uploadImageButton.setVisibility(View.VISIBLE);                
                        }else{
                            Toast.makeText(this,"Error while capturing Image",Toast.LENGTH_LONG).show();
                        }
                    }else{
                        Toast.makeText(this,"Error while capturing Image",Toast.LENGTH_LONG).show();
                    }
                } 
            }
    

    这是onActivityResult()中使用的getBitmap()方法 . 在获取相机捕获图像位图时,我已经完成了所有可能的性能改进 .

    private Bitmap getBitmap(String path) {
    
            Uri uri = Uri.fromFile(new File(path));
            InputStream in = null;
            try {
                final int IMAGE_MAX_SIZE = 1200000; // 1.2MP
                in = getContentResolver().openInputStream(uri);
    
                // Decode image size
                BitmapFactory.Options o = new BitmapFactory.Options();
                o.inJustDecodeBounds = true;
                BitmapFactory.decodeStream(in, null, o);
                in.close();
    
    
                int scale = 1;
                while ((o.outWidth * o.outHeight) * (1 / Math.pow(scale, 2)) >
                        IMAGE_MAX_SIZE) {
                    scale++;
                }
                Log.d("", "scale = " + scale + ", orig-width: " + o.outWidth + ", orig-height: " + o.outHeight);
    
                Bitmap b = null;
                in = getContentResolver().openInputStream(uri);
                if (scale > 1) {
                    scale--;
                    // scale to max possible inSampleSize that still yields an image
                    // larger than target
                    o = new BitmapFactory.Options();
                    o.inSampleSize = scale;
                    b = BitmapFactory.decodeStream(in, null, o);
    
                    // resize to desired dimensions
                    int height = b.getHeight();
                    int width = b.getWidth();
                    Log.d("", "1th scale operation dimenions - width: " + width + ", height: " + height);
    
                    double y = Math.sqrt(IMAGE_MAX_SIZE
                            / (((double) width) / height));
                    double x = (y / height) * width;
    
                    Bitmap scaledBitmap = Bitmap.createScaledBitmap(b, (int) x,
                            (int) y, true);
                    b.recycle();
                    b = scaledBitmap;
    
                    System.gc();
                } else {
                    b = BitmapFactory.decodeStream(in);
                }
                in.close();
    
                Log.d("", "bitmap size - width: " + b.getWidth() + ", height: " +
                        b.getHeight());
                return b;
            } catch (IOException e) {
                Log.e("", e.getMessage(), e);
                return null;
            }
        }
    

    希望能帮助到你!

  • 30

    从相机中捕获照片从图库中选取图像并将其设置为布局或图像视图的背景 . 这是示例代码 .

    import java.io.File;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.OutputStream;
    
    import android.app.Activity;
    import android.app.AlertDialog;
    import android.content.DialogInterface;
    import android.content.Intent;
    import android.database.Cursor;
    import android.graphics.Bitmap;
    import android.graphics.BitmapFactory;
    import android.graphics.drawable.BitmapDrawable;
    import android.graphics.drawable.Drawable;
    import android.net.Uri;
    import android.os.Bundle;
    import android.os.Environment;
    
        import android.provider.MediaStore;
        import android.util.Log;
        import android.view.View;
        import android.view.View.OnClickListener;
        import android.widget.AdapterView;
        import android.widget.AdapterView.OnItemClickListener;
        import android.widget.GridView;
        import android.widget.ImageView;
        import android.widget.LinearLayout;
    
        public class Post_activity extends Activity
        {
            final int TAKE_PICTURE = 1;
            final int ACTIVITY_SELECT_IMAGE = 2;
    
            ImageView openCameraOrGalleryBtn,cancelBtn;
            LinearLayout backGroundImageLinearLayout;
    
            public void onCreate(Bundle savedBundleInstance) {
                super.onCreate(savedBundleInstance);
                overridePendingTransition(R.anim.slide_up,0);
                setContentView(R.layout.post_activity);
    
                backGroundImageLinearLayout=(LinearLayout)findViewById(R.id.background_image_linear_layout);
                cancelBtn=(ImageView)findViewById(R.id.cancel_icon);
    
                openCameraOrGalleryBtn=(ImageView)findViewById(R.id.camera_icon);
    
    
    
                openCameraOrGalleryBtn.setOnClickListener(new OnClickListener() {
    
                    @Override
                    public void onClick(View v) {
                        // TODO Auto-generated method stub
    
                        selectImage();
                    }
                });
                cancelBtn.setOnClickListener(new OnClickListener() {
    
                    @Override
                    public void onClick(View v) {
                        // TODO Auto-generated method stub
                    overridePendingTransition(R.anim.slide_down,0);
                    finish();
                    }
                });
    
            }
    
        public void selectImage()
            {
                 final CharSequence[] options = { "Take Photo", "Choose from Gallery","Cancel" };
                 AlertDialog.Builder builder = new AlertDialog.Builder(Post_activity.this);
                    builder.setTitle("Add Photo!");
                    builder.setItems(options,new DialogInterface.OnClickListener() {
    
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            // TODO Auto-generated method stub
                            if(options[which].equals("Take Photo"))
                            {
                                Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); 
                                startActivityForResult(cameraIntent, TAKE_PICTURE);
                            }
                            else if(options[which].equals("Choose from Gallery"))
                            {
                                Intent intent=new Intent(Intent.ACTION_PICK,android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
                                startActivityForResult(intent, ACTIVITY_SELECT_IMAGE);
                            }
                            else if(options[which].equals("Cancel"))
                            {
                                dialog.dismiss();
                            }
    
                        }
                    });
                    builder.show();
            }
            public void onActivityResult(int requestcode,int resultcode,Intent intent)
            {
                super.onActivityResult(requestcode, resultcode, intent);
                if(resultcode==RESULT_OK)
                {
                    if(requestcode==TAKE_PICTURE)
                    {
                        Bitmap photo = (Bitmap)intent.getExtras().get("data"); 
                        Drawable drawable=new BitmapDrawable(photo);
                        backGroundImageLinearLayout.setBackgroundDrawable(drawable);
    
                    }
                    else if(requestcode==ACTIVITY_SELECT_IMAGE)
                    {
                        Uri selectedImage = intent.getData();
                        String[] filePath = { MediaStore.Images.Media.DATA };
                        Cursor c = getContentResolver().query(selectedImage,filePath, null, null, null);
                        c.moveToFirst();
                        int columnIndex = c.getColumnIndex(filePath[0]);
                        String picturePath = c.getString(columnIndex);
                        c.close();
                        Bitmap thumbnail = (BitmapFactory.decodeFile(picturePath));
                        Drawable drawable=new BitmapDrawable(thumbnail);
                        backGroundImageLinearLayout.setBackgroundDrawable(drawable);
    
    
                    }
                }
            }
    
            public void onBackPressed() {
                super.onBackPressed();
                //overridePendingTransition(R.anim.slide_down,0);
            }
        }
    
    Add these permission in Androidmenifest.xml file
    
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
        <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
        <uses-permission android:name="android.permission.CAMERA"/>
    
  • 0

    在活动中:

    @Override
        protected void onCreate(Bundle savedInstanceState) {
                     image = (ImageView) findViewById(R.id.imageButton);
            image.setOnClickListener(new OnClickListener() {
    
                @Override
                public void onClick(View v) {
                    try {
                    SimpleDateFormat sdfPic = new SimpleDateFormat(DATE_FORMAT);
                    currentDateandTime = sdfPic.format(new Date()).replace(" ", "");
                    File imagesFolder = new File(IMAGE_PATH, currentDateandTime);
                    imagesFolder.mkdirs();
                    Random generator = new Random();
                    int n = 10000;
                    n = generator.nextInt(n);
                    String fname = IMAGE_NAME + n + IMAGE_FORMAT;
                    File file = new File(imagesFolder, fname);
                    outputFileUri = Uri.fromFile(file);
                    cameraIntent= new Intent(
                            android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
                    cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, outputFileUri);
                                    startActivityForResult(cameraIntent, CAMERA_DATA);
                    }catch(Exception e) {
                        e.printStackTrace();
                    }
    
                }
            });
               @Override
        public void onActivityResult(int requestCode, int resultCode, Intent data) {
            super.onActivityResult(requestCode, resultCode, data);
            switch(requestCode) {
            case CAMERA_DATA :
                    final int IMAGE_MAX_SIZE = 300;
                    try {
                        // Bitmap bitmap;
                        File file = null;
                        FileInputStream fis;
                        BitmapFactory.Options opts;
                        int resizeScale;
                        Bitmap bmp;
                        file = new File(outputFileUri.getPath());
                        // This bit determines only the width/height of the
                        // bitmap
                        // without loading the contents
                        opts = new BitmapFactory.Options();
                        opts.inJustDecodeBounds = true;
                        fis = new FileInputStream(file);
                        BitmapFactory.decodeStream(fis, null, opts);
                        fis.close();
    
                        // Find the correct scale value. It should be a power of
                        // 2
                        resizeScale = 1;
    
                        if (opts.outHeight > IMAGE_MAX_SIZE
                                || opts.outWidth > IMAGE_MAX_SIZE) {
                            resizeScale = (int) Math.pow(2, (int) Math.round(Math.log(IMAGE_MAX_SIZE/ (double) Math.max(opts.outHeight, opts.outWidth)) / Math.log(0.5)));
                        }
    
                        // Load pre-scaled bitmap
                        opts = new BitmapFactory.Options();
                        opts.inSampleSize = resizeScale;
                        fis = new FileInputStream(file);
                        bmp = BitmapFactory.decodeStream(fis, null, opts);
                        Bitmap getBitmapSize = BitmapFactory.decodeResource(
                                getResources(), R.drawable.male);
                        image.setLayoutParams(new RelativeLayout.LayoutParams(
                                200,200));//(width,height);
                        image.setImageBitmap(bmp);
                        image.setRotation(90);
                        fis.close();
    
                        ByteArrayOutputStream baos = new ByteArrayOutputStream();
                        bmp.compress(Bitmap.CompressFormat.JPEG, 70, baos);
                        imageByte = baos.toByteArray();
                        break;
                    } catch (FileNotFoundException e) {
    
                        e.printStackTrace();
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
            }
    

    在layout.xml中:

    enter code here
    <RelativeLayout
            android:id="@+id/relativeLayout2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content">
    
    
            <ImageView
                android:id="@+id/imageButton"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
    
                                android:src="@drawable/XXXXXXX"
                android:textAppearance="?android:attr/textAppearanceSmall" />
    

    在manifest.xml中:

    <uses-permission android:name =“android.permission.CAMERA”/> <uses-feature android:name =“android.hardware.camera”/>

  • 8

    您可以使用带缩略图的自定义相机 . 你可以看看我的project .

  • 6

    使用以下代码使用移动相机捕获图片 . 如果您使用的版本高于Lolipop,您也应该添加权限请求 .

    private void cameraIntent()
        {
              Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
              startActivityForResult(intent, REQUEST_CAMERA);
        }
    
    @override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {  
         if (requestCode == CAMERA_REQUEST && resultCode == Activity.RESULT_OK) {  
                Bitmap photo = (Bitmap) data.getExtras().get("data"); 
                imageView.setImageBitmap(photo);
         }  
    }
    
  • 15

    Here you can open camera or gallery and set the selected image into imageview

    private static final String IMAGE_DIRECTORY = "/YourDirectName";
    private Context mContext;
    private CircleImageView circleImageView;  // imageview
    private int GALLERY = 1, CAMERA = 2;
    

    Add permissions in manifest

    <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" />
    

    In onCreate()

    requestMultiplePermissions(); // check permission 
    
        circleImageView = findViewById(R.id.profile_image);
        circleImageView.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                showPictureDialog();
            }
        });
    

    Show options dialog box (to select image from camera or gallery)

    private void showPictureDialog() {
        AlertDialog.Builder pictureDialog = new AlertDialog.Builder(this);
        pictureDialog.setTitle("Select Action");
        String[] pictureDialogItems = {"Select photo from gallery", "Capture photo from camera"};
        pictureDialog.setItems(pictureDialogItems,
                new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        switch (which) {
                            case 0:
                                choosePhotoFromGallary();
                                break;
                            case 1:
                                takePhotoFromCamera();
                                break;
                        }
                    }
                });
        pictureDialog.show();
    }
    

    Get photo from Gallery

    public void choosePhotoFromGallary() {
        Intent galleryIntent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
        startActivityForResult(galleryIntent, GALLERY);
    }
    

    Get photo from Camera

    private void takePhotoFromCamera() {
        Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
        startActivityForResult(intent, CAMERA);
    }
    

    Once the image is get selected or captured then ,

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
    
        super.onActivityResult(requestCode, resultCode, data);
        if (resultCode == this.RESULT_CANCELED) {
            return;
        }
        if (requestCode == GALLERY) {
            if (data != null) {
                Uri contentURI = data.getData();
                try {
                    Bitmap bitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(), contentURI);
                    String path = saveImage(bitmap);
                    Toast.makeText(getApplicationContext(), "Image Saved!", Toast.LENGTH_SHORT).show();
                    circleImageView.setImageBitmap(bitmap);
    
                } catch (IOException e) {
                    e.printStackTrace();
                    Toast.makeText(getApplicationContext(), "Failed!", Toast.LENGTH_SHORT).show();
                }
            }
    
        } else if (requestCode == CAMERA) {
            Bitmap thumbnail = (Bitmap) data.getExtras().get("data");
            circleImageView.setImageBitmap(thumbnail);
            saveImage(thumbnail);
            Toast.makeText(getApplicationContext(), "Image Saved!", Toast.LENGTH_SHORT).show();
        }
    }
    

    Now its time to store the picture

    public String saveImage(Bitmap myBitmap) {
        ByteArrayOutputStream bytes = new ByteArrayOutputStream();
        myBitmap.compress(Bitmap.CompressFormat.JPEG, 90, bytes);
        File wallpaperDirectory = new File(Environment.getExternalStorageDirectory() + IMAGE_DIRECTORY);
        if (!wallpaperDirectory.exists()) {  // have the object build the directory structure, if needed.
            wallpaperDirectory.mkdirs();
        }
    
        try {
            File f = new File(wallpaperDirectory, Calendar.getInstance().getTimeInMillis() + ".jpg");
            f.createNewFile();
            FileOutputStream fo = new FileOutputStream(f);
            fo.write(bytes.toByteArray());
            MediaScannerConnection.scanFile(this,
                    new String[]{f.getPath()},
                    new String[]{"image/jpeg"}, null);
            fo.close();
            Log.d("TAG", "File Saved::---&gt;" + f.getAbsolutePath());
    
            return f.getAbsolutePath();
        } catch (IOException e1) {
            e1.printStackTrace();
        }
        return "";
    }
    

    Request permission

    private void requestMultiplePermissions() {
        Dexter.withActivity(this)
                .withPermissions(
                        Manifest.permission.CAMERA,
                        Manifest.permission.WRITE_EXTERNAL_STORAGE,
                        Manifest.permission.READ_EXTERNAL_STORAGE)
                .withListener(new MultiplePermissionsListener() {
                    @Override
                    public void onPermissionsChecked(MultiplePermissionsReport report) {
                        if (report.areAllPermissionsGranted()) {  // check if all permissions are granted
                            Toast.makeText(getApplicationContext(), "All permissions are granted by user!", Toast.LENGTH_SHORT).show();
                        }
    
                        if (report.isAnyPermissionPermanentlyDenied()) { // check for permanent denial of any permission
                            // show alert dialog navigating to Settings
                            //openSettingsDialog();
                        }
                    }
    
                    @Override
                    public void onPermissionRationaleShouldBeShown(List<PermissionRequest> permissions, PermissionToken token) {
                        token.continuePermissionRequest();
                    }
                }).
                withErrorListener(new PermissionRequestErrorListener() {
                    @Override
                    public void onError(DexterError error) {
                        Toast.makeText(getApplicationContext(), "Some Error! ", Toast.LENGTH_SHORT).show();
                    }
                })
                .onSameThread()
                .check();
    }
    

相关问题