android用相机拍摄多张图片 [英] android take multiple image with camera

查看:113
本文介绍了android用相机拍摄多张图片的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我已经制作了一个代码,用于使用设备内置摄像头捕获图像并将其存档在数据库服务器中。每次我捕获图像并查看它时,它将动态地生成另一个 ImageView 布局(例如:图像 ic_launcher



每当点击 ic_launcher 图片时,它都会转到 MainActivity.java 页面,并使用意图,拍摄另一张照片。



我的问题是,如何在 uploadActivity.java 中查看所有捕获的图像/存档图像?



注意:图片在 uploadactivity.java

mainactivity.java

  private void captureImage( ){
意图意图=新意图(MediaStore.ACTION_IMAGE_CAPTURE);

fileUri = getOutputMediaFileUri(MEDIA_TYPE_IMAGE);

intent.putExtra(MediaStore.EXTRA_OUTPUT,fileUri);

//启动图像捕获Intent
startActivityForResult(intent,CAMERA_CAPTURE_IMAGE_REQUEST_CODE);
}
@Override
protected void onSaveInstanceState(Bundle outState){
super.onSaveInstanceState(outState);

//将文件url保存在bundle中,因为它在屏幕方向上为null
//更改
outState.putParcelable(file_uri,fileUri);
}

@Override
protected void onRestoreInstanceState(Bundle savedInstanceState){
super.onRestoreInstanceState(savedInstanceState);

//获取文件url
fileUri = savedInstanceState.getParcelable(file_uri);
}



/ **
*关闭相机后将调用接收活动结果方法
* * /
@Override
protected void onActivityResult(int requestCode,int resultCode,Intent data){
//如果结果正在捕获Image
if(requestCode == CAMERA_CAPTURE_IMAGE_REQUEST_CODE){
if (resultCode == RESULT_OK){

launchUploadActivity(true);


}否则if(resultCode == RESULT_CANCELED){

//用户取消图像捕获
Toast.makeText(getApplicationContext(),
用户取消图像捕获,Toast.LENGTH_SHORT)
.show();

} else {
//无法捕获图像
Toast.makeText(getApplicationContext(),
抱歉!无法捕获图像,Toast.LENGTH_SHORT)
.show();
}

}
}

private void launchUploadActivity(boolean isImage){
Intent i = new Intent(MainActivity.this,UploadActivity 。类);
i.putExtra(filePath,fileUri.getPath());
i.putExtra(isImage,isImage);
startActivity(i);
}

/ **
* ------------助手方法--------------- -------
* * /


public Uri getOutputMediaFileUri(int type){
return Uri.fromFile(getOutputMediaFile(type));
}


私有静态文件getOutputMediaFile(int type){

//外部sdcard位置
文件mediaStorageDir =新文件(
环境
.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES),
Config.IMAGE_DIRECTORY_NAME);

//如果存储目录不存在,则创建存储目录
if(!mediaStorageDir.exists()){
if(!mediaStorageDir.mkdirs()){
Log.d(TAG,糟糕!创建失败
+ Config.IMAGE_DIRECTORY_NAME +目录);
返回null;
}
}

//创建媒体文件名
字符串timeStamp = new SimpleDateFormat(yyyyMMdd_HHmmss,
Locale.getDefault())。 format(new Date());
文件mediaFile;
mediaFile = new File(mediaStorageDir.getPath()+ File.separator
+IMG_+ timeStamp +.jpg);


返回mediaFile;
}

UploadActivity.java

  protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_upload);

txtPercentage =(TextView)findViewById(R.id.txtPercentage);
btnUpload =(Button)findViewById(R.id.btnUpload);
Button btnTaking =(Button)findViewById(R.id.btntake);
layout2 =(LinearLayout)findViewById(R.id.ly2);
progressBar =(ProgressBar)findViewById(R.id.progressBar);
vidPreview =(VideoView)findViewById(R.id.videoPreview);


//更改操作栏背景颜色
getActionBar()。setBackgroundDrawable(
new ColorDrawable(Color.parseColor(getResources()。getString(
) R.color.action_bar))));

//接收先前活动的数据
Intent intent = getIntent();

//在之前的活动中捕获的图像或视频路径
filePath = intent.getStringExtra(filePath);


ArrayList< String> yourFilePaths = new ArrayList<>(); //创建ArrayList

//首先你必须检查你是否保存了文件路径
SharedPreferences prefs = getSharedPreferences(SavedFilePaths,
Context.MODE_PRIVATE);
String myJSONArrayString = prefs.getString(SavedFilePathsJSONArray,
);
if(!myJSONArrayString.isEmpty()){
JSONArray jsonArray = null;
try {
jsonArray = new JSONArray(myJSONArrayString);
} catch(JSONException e){
// TODO自动生成的catch块
e.printStackTrace();
}
for(int i = 0; i< jsonArray.length(); i ++){
try {
yourFilePaths.add(jsonArray.get(i).toString ());
} catch(JSONException e){
// TODO自动生成的catch块
e.printStackTrace();
}
}
}


//添加您拍摄的最后一张照片
yourFilePaths.add(filePath);
//在SharedPreferences中保存新的ArrayList:
JSONArray mJSONArray = new JSONArray(yourFilePaths);
SharedPreferences.Editor editor = prefs.edit();
editor.putString(SavedFilePathsJSONArray,mJSONArray.toString());

//按filePaths显示图像
文件imgFile;
for(int i = 0; i< yourFilePaths.size(); ++ i){
imgFile = new File(yourFilePaths.get(i));
if(imgFile.exists()){
final BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = 8;

Bitmap myBitmap = BitmapFactory.decodeFile(imgFile.getAbsolutePath(),options);

ImageView myImage = new ImageView(this);

myImage.setImageBitmap(myBitmap); //在这一步你需要
//创建动态imageViews
//来查看多个
//图片
layout2.addView(myImage); //然后将您的动态图片视图添加到
//您的布局

}
}

btnTaking.setOnClickListener(new OnClickListener(){

@Override
public void onClick(View v){
// TODO自动生成的方法stub
Intent intent = new Intent(UploadActivity.this,MainActivity.class);
startActivity(intent);
}
});

btnUpload.setOnClickListener(new View.OnClickListener(){

@Override
public void onClick(View v){
//上传文件服务器
new UploadFileToServer()。execute();
}
});

}

Activity_Upload

 < LinearLayout xmlns:android =http://schemas.android.com/apk/res/android
android: layout_width =fill_parent
android:layout_height =fill_parent
android:background =@ color / view_background
android:orientation =vertical
android:padding = 10dp>

<! - 显示拍摄的照片 - >


< LinearLayout
android:id =@ + id / ly2
android:layout_width =wrap_content
android:layout_height = 100dp
android:orientation =vertical>

< / LinearLayout>

< TextView
android:id =@ + id / txtPercentage
android:layout_width =wrap_content
android:layout_height =wrap_content
android:layout_gravity =center_horizo​​ntal
android:layout_marginBottom =15dp
android:layout_marginTop =15dp
android:textColor =@ color / txt_font
android :textSize =30dp/>

< ProgressBar
android:id =@ + id / progressBar
style =?android:attr / progressBarStyleHorizo​​ntal
android:layout_width =fill_parent
android:layout_height =20dp
android:layout_marginBottom =35dp
android:visibility =gone/>

< Button
android:id =@ + id / btnUpload
android:layout_width =wrap_content
android:layout_height =wrap_content
android:layout_gravity =center_horizo​​ntal
android:layout_marginBottom =20dp
android:background =@ color / btn_bg
android:paddingLeft =20dp
android :paddingRight =20dp
android:text =@ string / btnUploadToServer
android:textColor =@ color / white
android:visibility =gone
/ >
< TextView
android:id =@ + id / idt
android:layout_width =wrap_content
android:layout_height =wrap_content

/>

< Button
android:id =@ + id / btntake
android:layout_width =wrap_content
android:layout_height =wrap_content
android:layout_gravity =center_horizo​​ntal
android:layout_marginBottom =20dp
android:background =@ color / btn_bg
android:paddingLeft =20dp
android :paddingRight =20dp
android:text =拍下另一张照片
android:textColor =@ color / white/>



输出





注意:我从 androidhive

获得此代码

解决方案

现在好了我想我明白你的问题。
要了解我的代码,请检查以下内容:




解决你的问题?


I've already made a code for capturing an image using device built-in camera and archiving it in the database server. For each time I captures an image and views it, it will make another ImageView layout dynamically (ex: the image is ic_launcher).

Whenever the ic_launcher image is clicked, it will go to the MainActivity.java page, with the use of intent, to take another image.

My question is, how can I view all of the captured images / archived images in the uploadActivity.java?

Note: the image is viewed in the uploadactivity.java

mainactivity.java

 private void captureImage() {
    Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);

    fileUri = getOutputMediaFileUri(MEDIA_TYPE_IMAGE);

    intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri);

    // start the image capture Intent
    startActivityForResult(intent, CAMERA_CAPTURE_IMAGE_REQUEST_CODE);
}
 @Override
protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);

    // save file url in bundle as it will be null on screen orientation
    // changes
    outState.putParcelable("file_uri", fileUri);
}

@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
    super.onRestoreInstanceState(savedInstanceState);

    // get the file url
    fileUri = savedInstanceState.getParcelable("file_uri");
}



/**
 * Receiving activity result method will be called after closing the camera
 * */
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    // if the result is capturing Image
    if (requestCode == CAMERA_CAPTURE_IMAGE_REQUEST_CODE) {
        if (resultCode == RESULT_OK) {

            launchUploadActivity(true);


        } else if (resultCode == RESULT_CANCELED) {

            // user cancelled Image capture
            Toast.makeText(getApplicationContext(),
                    "User cancelled image capture", Toast.LENGTH_SHORT)
                    .show();

        } else {
            // failed to capture image
            Toast.makeText(getApplicationContext(),
                    "Sorry! Failed to capture image", Toast.LENGTH_SHORT)
                    .show();
        }

    }
}

private void launchUploadActivity(boolean isImage){
    Intent i = new Intent(MainActivity.this, UploadActivity.class);
    i.putExtra("filePath", fileUri.getPath());
    i.putExtra("isImage", isImage);
    startActivity(i);
}

/**
 * ------------ Helper Methods ---------------------- 
 * */


public Uri getOutputMediaFileUri(int type) {
    return Uri.fromFile(getOutputMediaFile(type));
}


private static File getOutputMediaFile(int type) {

    // External sdcard location
    File mediaStorageDir = new File(
            Environment
                  .getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES),
            Config.IMAGE_DIRECTORY_NAME);

    // Create the storage directory if it does not exist
    if (!mediaStorageDir.exists()) {
        if (!mediaStorageDir.mkdirs()) {
            Log.d(TAG, "Oops! Failed create "
                    + Config.IMAGE_DIRECTORY_NAME + " directory");
            return null;
        }
    }

    // Create a media file name
    String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss",
            Locale.getDefault()).format(new Date());
    File mediaFile;
        mediaFile = new File(mediaStorageDir.getPath() + File.separator
                + "IMG_" + timeStamp + ".jpg");


    return mediaFile;
}

UploadActivity.java

  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_upload);

    txtPercentage = (TextView) findViewById(R.id.txtPercentage);
    btnUpload = (Button) findViewById(R.id.btnUpload);      
    Button  btnTaking = (Button)findViewById(R.id.btntake);
    layout2 = (LinearLayout) findViewById(R.id.ly2);
    progressBar = (ProgressBar) findViewById(R.id.progressBar);
    vidPreview = (VideoView) findViewById(R.id.videoPreview);


    // Changing action bar background color
    getActionBar().setBackgroundDrawable(
            new ColorDrawable(Color.parseColor(getResources().getString(
                    R.color.action_bar))));

    // Receiving the data from previous activity
    Intent intent = getIntent();

    // image or video path that is captured in previous activity
    filePath = intent.getStringExtra("filePath");


    ArrayList<String> yourFilePaths = new ArrayList<>();// Create ArrayList

    // first you have to check if you've saved filepaths
    SharedPreferences prefs = getSharedPreferences("SavedFilePaths",
            Context.MODE_PRIVATE);
    String myJSONArrayString = prefs.getString("SavedFilePathsJSONArray",
            "");
    if (!myJSONArrayString.isEmpty()) {
        JSONArray jsonArray = null;
        try {
            jsonArray = new JSONArray(myJSONArrayString);
        } catch (JSONException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        for (int i = 0; i < jsonArray.length(); i++) {
            try {
                yourFilePaths.add(jsonArray.get(i).toString());
            } catch (JSONException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }


    // add the last photo you've taken
    yourFilePaths.add(filePath);
    // Save the new ArrayList in SharedPreferences:
    JSONArray mJSONArray = new JSONArray(yourFilePaths);
    SharedPreferences.Editor editor = prefs.edit();
    editor.putString("SavedFilePathsJSONArray", mJSONArray.toString());

    // Show images by filePaths
    File imgFile;
    for (int i = 0; i < yourFilePaths.size(); ++i) {
        imgFile = new File(yourFilePaths.get(i));
        if (imgFile.exists()) {
              final BitmapFactory.Options options = new BitmapFactory.Options();
                options.inSampleSize = 8;

               Bitmap myBitmap = BitmapFactory.decodeFile(imgFile.getAbsolutePath(),options);

            ImageView myImage = new ImageView(this);

            myImage.setImageBitmap(myBitmap);// In this step you've to
                                                // create dynamic imageViews
                                                // to see more than one
                                                // picture
            layout2.addView(myImage);// Then add your dynamic imageviews to
                                    // your layout

        }
    }

    btnTaking.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
        Intent intent = new Intent(UploadActivity.this, MainActivity.class);
        startActivity(intent);
        }
    });

    btnUpload.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            // uploading the file to server
            new UploadFileToServer().execute();
        }
    });

}

Activity_Upload

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="@color/view_background"
android:orientation="vertical"
android:padding="10dp" >

<!-- To display picture taken -->


<LinearLayout
    android:id="@+id/ly2"
    android:layout_width="wrap_content"
    android:layout_height="100dp"
    android:orientation="vertical" >

</LinearLayout>

<TextView
    android:id="@+id/txtPercentage"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center_horizontal"
    android:layout_marginBottom="15dp"
    android:layout_marginTop="15dp"
    android:textColor="@color/txt_font"
    android:textSize="30dp" />

<ProgressBar
    android:id="@+id/progressBar"
    style="?android:attr/progressBarStyleHorizontal"
    android:layout_width="fill_parent"
    android:layout_height="20dp"
    android:layout_marginBottom="35dp"
    android:visibility="gone" />

<Button
    android:id="@+id/btnUpload"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center_horizontal"
    android:layout_marginBottom="20dp"
    android:background="@color/btn_bg"
    android:paddingLeft="20dp"
    android:paddingRight="20dp"
    android:text="@string/btnUploadToServer"
    android:textColor="@color/white"
    android:visibility="gone"
     />
<TextView 
    android:id="@+id/idt"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"

    />

<Button
    android:id="@+id/btntake"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center_horizontal"
    android:layout_marginBottom="20dp"
    android:background="@color/btn_bg"
    android:paddingLeft="20dp"
    android:paddingRight="20dp"
    android:text="Take Another Picture"
    android:textColor="@color/white" />

Output

Note: i got this code from androidhive

解决方案

Ok now i think i understand your problem. To understand my code check this:

what is sharedPreferences?

Show Image View from file path in android?

Create ImageViews dynamically inside a loop

Last Edit: add commit() solve the problem

What we are going to try is save the file paths in ArrayList and save this array in a SharedPreferences:

layout_example.xml <-- create a Layout on your xml to add imageViews inside

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginTop="5dp"
    android:padding="5dp">


    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:id="@+id/myLinearLayout"></LinearLayout>
</RelativeLayout>

UploadActivity.java

     Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_upload);//add the LinearLayout of the layout_example.xml

    txtPercentage = (TextView) findViewById(R.id.txtPercentage);
    btnUpload = (Button) findViewById(R.id.btnUpload);
    layout = (LinearLayout) findViewById(R.id.ly1);
    progressBar = (ProgressBar) findViewById(R.id.progressBar);
    imgPreview = (ImageView) findViewById(R.id.imgPreview);

    addImageView(layout);

    // Changing action bar background color
    getActionBar().setBackgroundDrawable(
            new ColorDrawable(Color.parseColor(getResources().getString(
                    R.color.action_bar))));

    // Receiving the data from previous activity
    Intent i = getIntent();

    // image or video path that is captured in previous activity
    filePath = i.getStringExtra("filePath");

   LinearLayour ly_myLayout = (LinearLayout)findViewById(R.id.myLinearLayout);
   ArrayList<String> yourFilePaths = new ArrayList<>();//Create ArrayList

    //first you have to check if you've saved filepaths
    SharedPreferences prefs = getSharedPreferences("SavedFilePaths",   Context.MODE_PRIVATE);
    String myJSONArrayString = prefs.getString("SavedFilePathsJSONArray", "");
    if(!myJSONArrayString.isEmpty()){
    JSONArray jsonArray = new JSONArray(myJSONArrayString);
      for (int i=0;i<jsonArray.length();i++){ 
        yourFilePaths.add(jsonArray.get(i).toString());
       } 
    }
    //add the last photo you've taken
     yourFilePaths.add(filePath);

    //Save the new ArrayList in SharedPreferences:
     JSONArray mJSONArray = new JSONArray(yourFilePaths);
     SharedPreferences.Editor editor = prefs.edit();
     editor.putString("SavedFilePathsJSONArray",mJSONArray.toString()).commit(); // add commit

    //Show images by filePaths             
    File imgFile;
      for (int i = 0; i < yourFilePaths.size(); ++i) {
        imgFile = new  File(yourFilePaths.get(i));
        if(imgFile.exists()){

        Bitmap myBitmap = BitmapFactory.decodeFile(imgFile.getAbsolutePath());

        ImageView myImage = new ImageView(this);

        myImage.setImageBitmap(myBitmap);// In this step you've to create dynamic imageViews to see more than one picture

        ly_myLayout.addView(myImage);//Then add your dynamic imageviews to your layout

        }
      }

    btnUpload.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            // uploading the file to server
            new UploadFileToServer().execute();
        }
    });

}

/**
 * Displaying captured image/video on the screen
 * */
private void previewMedia(boolean isImage) {
    // Checking whether captured media is image or video
    if (isImage) {
        imgPreview.setVisibility(View.VISIBLE);
        vidPreview.setVisibility(View.GONE);
        // bimatp factory
        BitmapFactory.Options options = new BitmapFactory.Options();

        // down sizing image as it throws OutOfMemory Exception for larger
        // images
        options.inSampleSize = 8;

        final Bitmap bitmap = BitmapFactory.decodeFile(filePath, options);

        imgPreview.setImageBitmap(bitmap);

    } 
}

    private void addImageView(LinearLayout layout) {
    i = 0;
    ImageView imageView = new ImageView(this);
    imageView.setImageResource(R.drawable.ic_launcher);
    imageView.setId(i);
    layout.addView(imageView);
    imageView.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            Intent intent = new Intent(UploadActivity.this,
                    MainActivity.class);
            startActivity(intent);
        }
    });
}

Solve your problem?

这篇关于android用相机拍摄多张图片的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆