ビットマップを圧縮しようとするとnullポインター例外が発生するので、それをByteArrayOutputStreamに送信してバイト配列を取得できます。画像をParseFileとしてParseデータベースにアップロードできるように、このバイト配列が必要です。ログエラーを以下に示します。
_01-11 23:29:41.522 32015-32015/com.example.whhsfbla.fashionnow E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.whhsfbla.fashionnow, PID: 32015
Java.lang.NullPointerException: Attempt to invoke virtual method 'boolean Android.graphics.Bitmap.compress(Android.graphics.Bitmap$CompressFormat, int, Java.io.OutputStream)' on a null object reference
at com.example.whhsfbla.fashionnow.PostActivity.uploadPost(PostActivity.Java:140)
at com.example.whhsfbla.fashionnow.PostActivity.access$100(PostActivity.Java:34)
at com.example.whhsfbla.fashionnow.PostActivity$2.onClick(PostActivity.Java:92)
at Android.view.View.performClick(View.Java:5254)
at Android.view.View$PerformClick.run(View.Java:21179)
at Android.os.Handler.handleCallback(Handler.Java:739)
at Android.os.Handler.dispatchMessage(Handler.Java:95)
at Android.os.Looper.loop(Looper.Java:145)
at Android.app.ActivityThread.main(ActivityThread.Java:6837)
at Java.lang.reflect.Method.invoke(Native Method)
at Java.lang.reflect.Method.invoke(Method.Java:372)
at com.Android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.Java:1404)
at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:1199)
_
エラーの原因となる行はbitmap.compress(Bitmap.CompressFormat.PNG, 100, stream);
です。
_ public class PostActivity extends Activity {
private final int SELECT_PHOTO = 1;
private InputStream imageStream;
private Uri uploadFileUri;
private Bitmap bitmap;
private TextView txtPostTitle;
private EditText editText;
private Button btnChoosePic, btnUploadPost;
private ImageView imgPreview;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_post);
txtPostTitle = (TextView) findViewById(R.id.txtPostTitle);
editText = (EditText) findViewById(R.id.editText);
btnChoosePic = (Button) findViewById(R.id.btnChoosePic);
btnUploadPost = (Button) findViewById(R.id.btnMakePost);
imgPreview = (ImageView) findViewById(R.id.imgPreview);
txtPostTitle.setText("Title:");
btnChoosePic.setText("Choose Picture");
btnUploadPost.setText("Create Post");
btnUploadPost.setEnabled(false);
/*btnChoosePic.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
try {
openImageIntent();
} catch (IOException e) {
e.printStackTrace();
}
}
}); */
btnChoosePic.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
try {
openImageIntent();
} catch (IOException e) {
e.printStackTrace();
}
}
});
btnUploadPost.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
uploadPost();
finish();
}
});
}
private void openImageIntent() throws IOException {
final File root = new File(Environment.getExternalStorageDirectory() +
File.separator + "MyDir" + File.separator);
root.mkdirs();
final String fileName = File.createTempFile("tmp", ".txt").getPath();
final File sdImageMainDirectory = new File(root, fileName);
uploadFileUri = Uri.fromFile(sdImageMainDirectory);
//Camera
final List<Intent> cameraIntents = new ArrayList<Intent>();
final Intent captureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
final PackageManager packageManager = getPackageManager();
final List<ResolveInfo> resolveInfoList = packageManager.queryIntentActivities(captureIntent, 0);
for (ResolveInfo res : resolveInfoList) {
final String packageName = res.activityInfo.packageName;
final Intent intent = new Intent(captureIntent);
intent.setComponent(new ComponentName(res.activityInfo.packageName, res.activityInfo.name));
intent.setPackage(packageName);
intent.putExtra(MediaStore.EXTRA_OUTPUT, uploadFileUri);
cameraIntents.add(intent);
}
//Filesystem
final Intent galleryIntent = new Intent();
galleryIntent.setType("image/*");
galleryIntent.setAction(Intent.ACTION_GET_CONTENT);
final Intent chooserIntent = Intent.createChooser(galleryIntent, "Select Source");
chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, cameraIntents.toArray(new Parcelable[cameraIntents.size()]));
startActivityForResult(chooserIntent, SELECT_PHOTO);
}
private void uploadPost() {
// Locate the image in res > drawable-hdpi
bitmap = BitmapFactory.decodeResource(getResources(), R.id.imgPreview);
// Convert it to byte
ByteArrayOutputStream stream = new ByteArrayOutputStream();
// Compress image to lower quality scale 1 - 100
bitmap.compress(Bitmap.CompressFormat.PNG, 100, stream);
byte[] image = stream.toByteArray();
// Create the ParseFile
ParseFile file = new ParseFile("image.png",image);
// Upload the image into ParseCloud
file.saveInBackground();
// Create a New Class called "ImageUpload" in Parse
ParseObject post = new ParseObject("Post");
// Create a column named "ImageName" and set the string
post.put("title", editText.getText().toString());
// Create a column named "ImageFile" and insert the image
post.put("ImageFile", file);
post.put("user", User.username);
// Create the class and the columns
post.saveInBackground();
// Show a simple toast message
Toast.makeText(PostActivity.this, "Post Uploaded",
Toast.LENGTH_SHORT).show();
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent imageIntent) {
super.onActivityResult(requestCode, resultCode, imageIntent);
if (resultCode == RESULT_OK) {
if (requestCode == SELECT_PHOTO) {
//Get the URI
final boolean isCamera;
if (imageIntent == null) {
isCamera = true;
} else {
final String action = imageIntent.getAction();
if (action == null) {
isCamera = false;
} else {
isCamera = action.equals(MediaStore.ACTION_IMAGE_CAPTURE);
}
}
Uri selectedImageUri;
if (isCamera) {
selectedImageUri = uploadFileUri;
} else {
selectedImageUri = imageIntent == null ? null : imageIntent.getData();
}
//Get the Bitmap from the URI, and set it to the ImageView
try {
imageStream = getContentResolver().openInputStream(selectedImageUri);
final Bitmap selectedImage = BitmapFactory.decodeStream(imageStream);
imgPreview.setImageBitmap(selectedImage);
btnUploadPost.setEnabled(true);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
}
}
}
_
bitmap
がnullであるため、nullポインタ例外が発生します。行く行を置き換えます
bitmap = BitmapFactory.decodeResource(getResources(), R.id.imgPreview);
これとともに
bitmap = ((BitmapDrawable) imgPreview.getDrawable()).getBitmap();
pNG形式を使用している場合、PNGは可逆形式であるため、画像は圧縮されません。画像の圧縮にはJPEGを使用し、品質は100ではなく0を使用します。
次に使用します
Bitmap decoded = BitmapFactory.decodeStream(new ByteArrayInputStream(stream.toByteArray()));
ビットマップがnullの場合の場合にエラーが発生する可能性があります
ビットマップビットマップ;をグローバル変数として宣言します。
そして、onActivityResultメソッドでbitmapオブジェクトを使用します。
Bitmap.createScaledBitmap を使用してみてください
Bitmap.createScaledBitmap(Bitmap src, int dstWidth, int dstHeight, boolean filter);