2016-01-21 175 views
3

我已经制作了一个代码,用于使用设备内置相机捕捉图像并将其归档到数据库服务器中。对于每个时间我捕获图像和视图,它会进行另一个ImageView的布局动态(例如:该图像是ic_launcherandroid用相机拍摄多个图像

每当点击ic_launcher图像,它会去MainActivity.java网页,使用意图,拍摄另一张照片。

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

:所述图像在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" /> 

输出

enter image description here

:我得到这个代码androidhive

+0

所以你想看到你在MaintActivity的UploadActivity拍摄的图像? –

+0

实际上,MainActivity仅用于访问摄像头拍摄图像。 UploadActivity用于查看所有图像并上传。如果我想拍摄另一张照片,我点击imageview(有意图)拍摄另一张照片的主要活动。在uploadactivity.java中,我只能查看1张图片。所以,我如何查看我所拍摄的所有图像? thx @FabioVenturiPastor – arvin

+0

请拍下3张照片后再进行String myJSONArrayString = prefs.getString(“SavedFilePathsJSONArray”, “”);做一个System.out.println(myJSONArrayString);和yourFilePaths.add(filePath)之后; (int j = 0; j

回答

1

好吧,现在我想我明白你的问题。 要理解我的代码检查:

what is sharedPreferences?

Show Image View from file path in android?

Create ImageViews dynamically inside a loop

最后编辑: 补充提交()解决问题

我们要尝试将文件路径保存在ArrayList中,并将该数组保存在SharedPreferenc中es:

layout_example。XML < - 创建你的XML布局添加imageViews内

<?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); 
     } 
    }); 
} 

enter image description here 解决问题了吗?

+0

对不起,如果我还是新来的,我认为“yourfilepath.length()”对于Arraylist是未定义的。我尝试使用yourfilepath.size(),但它仍然无法工作。我已经捕获了大约10张图片,但它仍然只显示我拍摄的最后一张图片。你能帮助我吗?我也在我的项目中输入你的代码,但我不知道它是否仍然无法工作,或者当我输入代码时我犯了一个错误。 thx – arvin

+0

好的等待我会将我的代码插入到您的项目中等待一分钟 –

+0

完成检查新的答案,然后对不起yourfilepath.size()不是yourfilepath.length() –

相关问题