2015-07-13 60 views
0

这是我的活动代码,点击捕获图片按钮时,它会从您的手机加载相机。在我用相机拍摄照片后,图片将显示在imageView上。然后我会点击上传图片图片按钮上传我的图片到服务器。在这里我遇到的问题是,代码在所有android version 4.4及以下版本都可以正常工作,当我用android 5.0测试此代码时,从相机拍摄的图片未显示在imageView上。我曾尝试过很多解决方案,但仍然失败。谁能帮我这个?谢谢。从相机拍摄的图像无法在图像视图中显示android 5.0,但在android 4.4中工作

活动代码

public class TestUpload extends Activity implements OnItemSelectedListener { 

private static final int CAMERA_CAPTURE_IMAGE_REQUEST_CODE = 100; 
public static final int MEDIA_TYPE_IMAGE = 1; 

private static final String IMAGE_DIRECTORY_NAME = "Hello camera"; 

private Uri fileUri; 

private ImageView imgPreview; 
private Button btnCapturePicture, btnUploadImage; 
private EditText itemname; 
private EditText description; 
private EditText price; 
private EditText contact; 

private String randNum, uname; 

Random random = new Random(); 
private static final String _CHAR = "ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890"; 
private static final int RANDOM_STR_LENGTH = 12;   

private Spinner spinCat, spinLoc; 

private String [] Category = {"IT Gadgets","Men Fashion","Women Fashion","Beauty","Sports","Cars and Motors","Furnitures","Music Instrument","Books","Property","Photography","Games and Toys","kids and Baby","Others"}; 
private String [] Location = {"Kuala Lumpur","Melacca","Johor","Selangor","Kelantan","Kedah","Negeri Sembilan", 
     "Pahang","Perak","Perlis","Penang","Sabah","Sarawak","Terengganu"}; 

private static final String TAG_SUCCESS = "success"; 

JSONParser2 jsonParser2 = new JSONParser2(); 

private static String url_create_image = "http://gemini888.tk/GP_trade_api_v2/image_connect/create_product.php"; 

private SweetAlertDialog pDialog; 

long totalSize = 0; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 

    super.onCreate(savedInstanceState); 
    setContentView(R.layout.upload_test); 

    ActionBar ab = getActionBar(); 
    ab.setBackgroundDrawable(new ColorDrawable(Color.parseColor("#96ead7"))); 
    ab.setDisplayHomeAsUpEnabled(true); 

    imgPreview = (ImageView) findViewById(R.id.imgPreview); 
    btnCapturePicture = (Button) findViewById(R.id.btn_camera); 
    btnUploadImage = (Button) findViewById(R.id.btn_upload); 
    itemname = (EditText) findViewById(R.id.input_upload_item_name); 
    description = (EditText) findViewById(R.id.input_item_desc); 
    price = (EditText) findViewById(R.id.upload_input_item_price); 
    contact = (EditText) findViewById(R.id.input_contact); 
    spinCat = (Spinner) findViewById(R.id.spin_category); 
    spinLoc = (Spinner) findViewById(R.id.spin_location); 

    ArrayAdapter<String> adapter_Category = new ArrayAdapter<String> 
    (this, android.R.layout.simple_spinner_item, Category); 

    ArrayAdapter<String> adapter_Location = new ArrayAdapter<String> 
    (this, android.R.layout.simple_spinner_item, Location); 

    adapter_Category.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 
    adapter_Location.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 

    spinCat.setAdapter(adapter_Category); 
    spinLoc.setAdapter(adapter_Location); 

    spinCat.setOnItemSelectedListener(this); 
    spinLoc.setOnItemSelectedListener(this); 

    DatabaseHandler db = new DatabaseHandler(getApplicationContext()); 
    HashMap<String, String> user = new HashMap<String, String>(); 
    user = db.getUserDetails(); 
    uname = user.get("uname"); 

    //timeStamp = new SimpleDateFormat ("yyyyMMdd_HHmmss", Locale.getDefault()).format(new Date()); 

    randNum = getRandomString(); 
    //capture image button click event 
    btnCapturePicture.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      //capture image 
      captureImage(); 
     } 
    }); 

    btnUploadImage.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View v) { 

       //uploading the file to server 
       new UploadFileToServer().execute(); 
     } 
    }); 
} 
//capturing Camera image will lunch camera app request image capture 
private void captureImage() { 

    Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
    fileUri = getOutputMediaFileUri(MEDIA_TYPE_IMAGE); 
    intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri); 

    //Start image capture intent 
    startActivityForResult(intent, CAMERA_CAPTURE_IMAGE_REQUEST_CODE); 
} 

//Receiving activity result method will be called after closing the camera 
@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 

    //if the result i capture image 
    if(requestCode == CAMERA_CAPTURE_IMAGE_REQUEST_CODE) { 
     if(resultCode == RESULT_OK) { 

      //success capture image, display it on imageview 
      previewCapturedImage(); 
     } else if (resultCode == RESULT_CANCELED) { 

      //user cancel 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(); 
     } 
    } 
} 

//Display image from a path to imageview 
private void previewCapturedImage() { 


     imgPreview.setVisibility(View.VISIBLE); 

     //bitmap factory 
     BitmapFactory.Options options = new BitmapFactory.Options(); 

     //downsize image as it throws Outofmemory execption for larger images 
     options.inSampleSize = 8; 
     final Bitmap bitmap = BitmapFactory.decodeFile(fileUri.getPath(), options); 

     imgPreview.setImageBitmap(bitmap); 

    } 

//store the file url as it will be null after returning from camera app 
@Override 
protected void onSaveInstanceState(Bundle outState) { 
    super.onSaveInstanceState(outState); 

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

//restore the fileUri again 
@Override 
protected void onRestoreInstanceState(Bundle savedInstanceState) { 
    super.onRestoreInstanceState(savedInstanceState); 

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

//create file Uri to store image 
public Uri getOutputMediaFileUri(int type) { 
    return Uri.fromFile(getOutputMediaFile(type)); 
} 

//returning image 
private File getOutputMediaFile(int type) { 

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

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

    //Create a media file name 
    File mediaFile; 
    if (type == MEDIA_TYPE_IMAGE) { 

     mediaFile = new File(mediaStorageDir.getPath() + File.separator + uname + randNum + ".jpg"); 
    } else { 
     return null; 
    } 

    return mediaFile; 
} 

//upload image to server 
private class UploadFileToServer extends AsyncTask<Void, Integer, String> { 


    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 
     pDialog = new SweetAlertDialog(TestUpload.this, SweetAlertDialog.PROGRESS_TYPE); 
     pDialog.getProgressHelper().setBarColor(Color.parseColor("#A5DC86")); 
     pDialog.setTitleText("Picture uploading, please wait.."); 
     //pDialog.setIndeterminate(false); 
     pDialog.setCancelable(true); 
     pDialog.show(); 
    } 

    @Override 
    protected String doInBackground(Void...params) { 

     String iname = itemname.getText().toString(); 
     String des = description.getText().toString(); 
     String iprice = price.getText().toString(); 
     String icontact = contact.getText().toString(); 

     String cat = spinCat.getSelectedItem().toString(); 
     String loc = spinLoc.getSelectedItem().toString(); 

     List<NameValuePair> param = new ArrayList<NameValuePair>(); 
     param.add(new BasicNameValuePair("name", iname)); 
     param.add(new BasicNameValuePair("description", des)); 
     param.add(new BasicNameValuePair("price", iprice)); 
     param.add(new BasicNameValuePair("username", uname)); 
     param.add(new BasicNameValuePair("category", cat)); 
     param.add(new BasicNameValuePair("location", loc)); 
     param.add(new BasicNameValuePair("timestamp", randNum)); 
     param.add(new BasicNameValuePair("contact", icontact)); 



     JSONObject json = jsonParser2.makeHttpRequest(url_create_image, 
       "POST", param); 

     Log.d("Create Response", json.toString()); 

     try { 
      int success = json.getInt(TAG_SUCCESS); 

      if (success == 1) { 
       // successfully created product 
       Log.d("Create Response", "success"); 
      } else { 
       // failed to create product 
       Toast.makeText(getApplicationContext(),"failed",Toast.LENGTH_SHORT).show(); 
      } 
     } catch (JSONException e) { 
      e.printStackTrace(); 
     } 

     return uploadFile();    
    } 

    @Override 
    protected void onPostExecute(String result) { 

     pDialog.dismiss(); 
     super.onPostExecute(result); 
    } 
} 

@SuppressWarnings("deprecation") 
private String uploadFile() { 
    String responseString = null; 

    HttpClient httpclient = new DefaultHttpClient(); 
    HttpPost httppost = new HttpPost(UserFunctions.FILE_UPLOAD_URL); 

    try { 
     AndroidMultiPartEntity entity = new AndroidMultiPartEntity(
       new ProgressListener() { 

        @Override 
        public void transferred(long num) { 
         setProgress((int) ((num/(float) totalSize) * 100)); 
        } 
       }); 

     File sourceFile = new File(fileUri.getPath()); 

     // Adding file data to http body 
     entity.addPart("image", new FileBody(sourceFile)); 

     // Extra parameters if you want to pass to server 
     entity.addPart("website", 
       new StringBody("http://gemini888.tk")); 
     entity.addPart("email", new StringBody("[email protected]")); 

     totalSize = entity.getContentLength(); 
     httppost.setEntity(entity); 

     // Making server call 
     HttpResponse response = httpclient.execute(httppost); 
     HttpEntity r_entity = response.getEntity(); 

     int statusCode = response.getStatusLine().getStatusCode(); 
     if (statusCode == 200) { 
      // Server response 
      responseString = EntityUtils.toString(r_entity); 
     } else { 
      responseString = "Error occurred! Http Status Code: " 
        + statusCode; 
     } 

    } catch (ClientProtocolException e) { 
     responseString = e.toString(); 
    } catch (IOException e) { 
     responseString = e.toString(); 
    } 

    return responseString; 

} 

public String getRandomString() { 

    StringBuffer randStr = new StringBuffer(); 
    for (int i =0; i<RANDOM_STR_LENGTH; i++) { 
     int number = getRandomNumber(); 
     char ch = _CHAR.charAt(number); 
     randStr.append(ch); 
    } 
    return randStr.toString(); 
} 

private int getRandomNumber() { 

    int randomInt = 0; 
    randomInt = random.nextInt(_CHAR.length()); 
    if (randomInt - 1 == -1) { 
     return randomInt; 
    } else { 
     return randomInt - 1; 
    } 
} 



@Override 
public void onItemSelected(AdapterView<?> parent, View view, int position, 
     long id) { 
    // TODO Auto-generated method stub 
    spinCat.setSelection(position); 

    String CatList = (String) spinCat.getSelectedItem(); 

    CatList.toString(); 

} 





@Override 
public void onNothingSelected(AdapterView<?> parent) { 
    // TODO Auto-generated method stub 

} 


@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    switch (item.getItemId()) { 
     case android.R.id.home: 
      // app icon in action bar clicked; go home 
      Intent intent = new Intent(this, MainActivity.class); 
      intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
      startActivity(intent); 
      finish(); 

      return true; 

     default: 
      return super.onOptionsItemSelected(item); 
    } 
} 
} 
+0

你有没有获得在onActivity结果图像网址是什么? –

+0

http://stackoverflow.com/questions/29532914/android-intent-with-multiple-option-i-e-pick-image-from-gallary-and-capture-im/29560548#29560548 –

回答

0
在captureImage

()方法尝试。

private void captureImage() { 

     Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
     fileUri = getOutputMediaFileUri(MEDIA_TYPE_IMAGE); 
     intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri); 
     try { 
      intent.putExtra("return-data", true); 
      startActivityForResult(intent, CAMERA_CAPTURE_IMAGE_REQUEST_CODE); 

     } catch (ActivityNotFoundException e) { 
      e.printStackTrace(); 
     } 
     //Start image capture intent 
    } 
0
//first of all create a directory to store your captured Images   
    String root = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).toString(); 
    File myDir = new File(root + "/PGallery"); 
    if (!myDir.exists()) { 
     myDir.mkdirs(); 
    } 

    //Give name to your captured Image 
    SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMddHHmmss",java.util.Locale.getDefault()); 
    Date date = new Date(); 
    String sDate = formatter.format(date); 
    imageName = "PRAVA"+sDate+".jpg"; 

    try { 
     Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
     filePath = new File(myDir,imageName); 
     intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(filePath)); 
     startActivityForResult(intent, REQUEST_IMAGE_CAPTURE); 
    } 
    catch (ActivityNotFoundException e) { 
     String errorMessage = "Whoops - your device doesn't support capturing images!"; 
     Toast.makeText(this, errorMessage, Toast.LENGTH_LONG).show(); 
    } 

在Actvity结果:

if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == RESULT_OK) { 
     try { 
      ImagePath = filePath.getAbsolutePath(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

     BitmapFactory.Options bitmapOptions = new BitmapFactory.Options(); 
     Bitmap bitmap = BitmapFactory.decodeFile(ImagePath, bitmapOptions); 

     ImageView mImageView = (ImageView) findViewById(R.id.ivCamreaPic); 
     mImageView.setImageBitmap(bitmap); 
    } 
相关问题