2016-01-12 2 views
2

Я получаю исключение нулевого указателя при попытке сжать битмап, чтобы я мог отправить его в ByteArrayOutputStream, чтобы получить массив байтов. Мне нужен этот массив байтов, поэтому я могу загрузить изображение в свою базу данных Parse в качестве ParseFile. Ошибка журнала показана ниже.Исключение Null Pointer при попытке сжать битмап

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(); 
       } 
      } 
     } 
    } 
} 
+1

Не верно, в соответствии с документацией: http://developer.android.com/reference /android/graphics/BitmapFactory.html#decodeResource%28android.content.res.Resources,%20int,%20android.graphics.BitmapFactory.Options%29. Он может вернуть значение null, если «данные изображения не могут быть декодированы». – Szymon

+0

@MikeM. Как получить R.drawable из ImageView? Я не могу передать ImageView.getDrawable() в качестве аргумента, поскольку он должен быть int. –

+1

@MikeM. Ты прав. Извини, я виноват. – Szymon

ответ

8

Вы получаете исключения нулевого указателя, потому что bitmap является недействительным. Заменить линию, которая идет

bitmap = BitmapFactory.decodeResource(getResources(), R.id.imgPreview); 

с этим

bitmap = ((BitmapDrawable) imgPreview.getDrawable()).getBitmap(); 
+0

сохранил мой день ... Я изменил эту строку моего кода «Растровое изображение битмапа = imageView.getDrawingCache();' to 'Bitmap bitmap = ((BitmapDrawable) imageView.getDrawable()). GetBitmap();' – crakama

1

, если вы используете формат PNG, то он не будет сжимать изображение, потому что PNG является формат без потерь. используйте JPEG для сжатия вашего изображения и используйте 0 вместо 100 в качестве.

затем использовать

Bitmap decoded = BitmapFactory.decodeStream(new ByteArrayInputStream(stream.toByteArray())); 
+2

Как это связано с вопросом? И, конечно, PNG сжимается. Быть потерянным или без потерь не имеет к этому никакого отношения. –