我正在阅读Parse.com的Anywall和MealSpotter示例,并想知道我将如何组合他们的一些功能。例如,我如何拍摄和保存图片而不是简单地在Anywall示例的帖子中写文字?我会创建一个新的CameraFragment类,还是需要创建其他类?
答案 0 :(得分:2)
我在MealSpotter应用程序之后为我的大学创建了一个应用程序。
创建一个使用getter和setter扩展ParseObject的类
public ParseFile getPhotoFile() {
return getParseFile("photo");
}
public void setPhotoFile(ParseFile file) {
put("photo", file);
}
然后,创建CamaraFragment类
public class CameraFragment extends Fragment {
public static final String TAG = "CameraFragment";
private Camera camera;
private SurfaceView surfaceView;
private ParseFile photoFile;
private ActionButton photoButton;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup parent,
Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.fragment_camera, parent, false);
photoButton = (ActionButton) v.findViewById(R.id.camera_photo_button);
if (camera == null) {
try {
camera = Camera.open();
photoButton.setEnabled(true);
} catch (Exception e) {
Log.e(TAG, "No camera with exception: " + e.getMessage());
photoButton.setEnabled(false);
Toast.makeText(getActivity(), "No camera detected",
Toast.LENGTH_LONG).show();
}
}
photoButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (camera == null)
return;
camera.takePicture(new Camera.ShutterCallback() {
@Override
public void onShutter() {
// nothing to do
}
}, null, new Camera.PictureCallback() {
@Override
public void onPictureTaken(byte[] data, Camera camera) {
saveScaledPhoto(data);
}
});
}
});
surfaceView = (SurfaceView) v.findViewById(R.id.camera_surface_view);
SurfaceHolder holder = surfaceView.getHolder();
holder.addCallback(new Callback() {
public void surfaceCreated(SurfaceHolder holder) {
try {
if (camera != null) {
camera.setDisplayOrientation(90);
camera.setPreviewDisplay(holder);
camera.startPreview();
}
} catch (IOException e) {
Log.e(TAG, "Error setting up preview", e);
}
}
public void surfaceChanged(SurfaceHolder holder, int format,
int width, int height) {
// nothing to do here
}
public void surfaceDestroyed(SurfaceHolder holder) {
// nothing here
}
});
return v;
}
/*
* ParseQueryAdapter loads ParseFiles into a ParseImageView at whatever size
* they are saved. Since we never need a full-size image in our app, we'll
* save a scaled one right away.
*/
private void saveScaledPhoto(byte[] data) {
// Resize photo from camera byte array
Bitmap bookImage = BitmapFactory.decodeByteArray(data, 0, data.length);
// Trabajar con la foto aqui
int h = bookImage.getHeight();
int w = bookImage.getWidth();
Bitmap bookImageScaled = Bitmap.createScaledBitmap(bookImage, 200, 200//800, 800
* bookImage.getHeight() / bookImage.getWidth(), false);
// Override Android default landscape orientation and save portrait
Matrix matrix = new Matrix();
matrix.postRotate(90);
Bitmap rotatedScaledBookImage = Bitmap.createBitmap(bookImageScaled, 0,
0, bookImageScaled.getWidth(), bookImageScaled.getHeight(),
matrix, true);
/*Bitmap rotatedScaledBookImage = Bitmap.createBitmap(bookImage,0,0,bookImage.getWidth(),bookImage.getHeight(),matrix,true);*/
ByteArrayOutputStream bos = new ByteArrayOutputStream();
rotatedScaledBookImage.compress(Bitmap.CompressFormat.JPEG, 100, bos);
byte[] scaledData = bos.toByteArray();
// TEST SCALED DATA -> DATA
// Save the scaled image to Parse
photoFile = new ParseFile("book_photo.jpg", scaledData);
photoFile.saveInBackground(new SaveCallback() {
public void done(ParseException e) {
if (e != null) {
Toast.makeText(getActivity(),
"Error saving: " + e.getMessage(),
Toast.LENGTH_LONG).show();
} else {
addPhotoToSaleAndReturn(photoFile);
}
}
});
}
/*
* Once the photo has saved successfully, we're ready to return to the
* NewbookFragment. When we added the CameraFragment to the back stack, we
* named it "NewMealFragment". Now we'll pop fragments off the back stack
* until we reach that Fragment.
*/
private void addPhotoToSaleAndReturn(ParseFile photoFile) {
//((SaleFragment) getActivity()).getCurrentSale().setPhotoFile(photoFile);
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// Testttttttttttttt
SaleFragment.getCurrentSale().setPhotoFile(photoFile);
FragmentManager fm = getActivity().getSupportFragmentManager();
fm.popBackStack("NewSaleFragment",
FragmentManager.POP_BACK_STACK_INCLUSIVE);
}
@Override
public void onResume() {
super.onResume();
if (camera == null) {
try {
camera = Camera.open();
photoButton.setEnabled(true);
} catch (Exception e) {
Log.i(TAG, "No camera: " + e.getMessage());
photoButton.setEnabled(false);
Toast.makeText(getActivity(), "No camera detected",
Toast.LENGTH_LONG).show();
}
}
}
@Override
public void onPause() {
if (camera != null) {
camera.stopPreview();
camera.release();
}
super.onPause();
}
最后,将对象保存在您喜欢的活动中
// Save the sale and return
sale.saveInBackground(new SaveCallback() {
@Override
public void done(ParseException e) {
if (e == null) {
getActivity().setResult(Activity.RESULT_OK);
}
else {
Toast.makeText(
getActivity().getApplicationContext(),
"Error saving: " + e.getMessage(),
Toast.LENGTH_SHORT).show();
}
}
});