从图库中选择图像后我的应用程序强制关闭

时间:2016-02-08 17:02:20

标签: java android image-upload

我正在尝试在我的应用中创建上传功能,但在图库中选择图像后我的应用程序强制关闭。这是我的代码

AddCatergory.java

public class AddCategory extends AppCompatActivity implements View.OnClickListener {

private Button buttonChoose;
private Button buttonUpload;
private ImageView imageView;
private EditText editTextName;
private Bitmap bitmap;
private int PICK_IMAGE_REQUEST = 1;
private String UPLOAD_URL ="http://knyjayjay.16mb.com/products/upload.php";
private String KEY_IMAGE = "image";
private String KEY_NAME = "name";
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_add_category);
    buttonUpload = (Button) findViewById(R.id.btn_addCat);
    buttonChoose = (Button) findViewById(R.id.chooseimgbtn);
    buttonChoose = (Button) findViewById(R.id.chooseimgbtn);
    buttonUpload = (Button) findViewById(R.id.btn_addCat);
    editTextName = (EditText) findViewById(R.id.input_name);
    imageView  = (ImageView) findViewById(R.id.imageView);
    buttonChoose.setOnClickListener(this);
    buttonUpload.setOnClickListener(this);
}
public String getStringImage(Bitmap bmp){
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    bmp.compress(Bitmap.CompressFormat.JPEG, 100, baos);
    byte[] imageBytes = baos.toByteArray();
    String encodedImage = Base64.encodeToString(imageBytes, Base64.DEFAULT);
    return encodedImage;
}
private void uploadImage(){
    //Showing the progress dialog
    final ProgressDialog loading = ProgressDialog.show(this,"Uploading","Please wait...",false,false);
    StringRequest stringRequest = new StringRequest(Request.Method.POST, UPLOAD_URL,
            new Response.Listener<String>() {
                @Override
                public void onResponse(String s) {
                    //Disimissing the progress dialog
                    loading.dismiss();
                    //Showing toast message of the response
                    Toast.makeText(AddCategory.this, s , Toast.LENGTH_LONG).show();
                }
            },
            new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError volleyError) {
                    //Dismissing the progress dialog
                    loading.dismiss();

                    //Showing toast
                    Toast.makeText(AddCategory.this, volleyError.getMessage().toString(), Toast.LENGTH_LONG).show();
                }
            }){
        @Override
        protected Map<String, String> getParams() throws AuthFailureError {
            //Converting Bitmap to String
            String image = getStringImage(bitmap);
            //Getting Image Name
            String name = editTextName.getText().toString();
            //Creating parameters
            Map<String,String> params = new Hashtable<String, String>();
            //Adding parameters
            params.put(KEY_IMAGE, image);
            params.put(KEY_NAME, name);

            //returning parameters
            return params;
        }
    };
    //Creating a Request Queue
    RequestQueue requestQueue = Volley.newRequestQueue(this);
    //Adding request to the queue
    requestQueue.add(stringRequest);
}
private void showFileChooser() {
    Intent intent = new Intent();
    intent.setType("image/*");
    intent.setAction(Intent.ACTION_GET_CONTENT);
    startActivityForResult(Intent.createChooser(intent, "Select Picture"), PICK_IMAGE_REQUEST);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == PICK_IMAGE_REQUEST && resultCode == RESULT_OK && data != null && data.getData() != null) {
        Uri filePath = data.getData();
        try {
            //Getting the Bitmap from Gallery
            bitmap = MediaStore.Images.Media.getBitmap(getContentResolver(), filePath);
            //Setting the Bitmap to ImageView
            imageView.setImageBitmap(bitmap);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
@Override
public void onClick(View v) {

    if(v == buttonChoose){
        showFileChooser();
    }

    if(v == buttonUpload){
        uploadImage();
    }
}  }

并且logcat中的错误是这个

java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=1, result=-1, data=Intent { dat=content://media/external/images/media/10608 }} to activity {com.jayjaudian.warehousemanagement/com.jayjaudian.warehousemanagement.activity.AddCategory}: java.lang.NullPointerException
at android.app.ActivityThread.deliverResults(ActivityThread.java)
at android.app.ActivityThread.handleSendResult(ActivityThread.java)
at android.app.ActivityThread.access$1300(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java)
at android.os.Handler.dispatchMessage(Handler.java)
at android.os.Looper.loop(Looper.java)
at android.app.ActivityThread.main(ActivityThread.java)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:836)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:652)
at de.robv.android.xposed.XposedBridge.main(XposedBridge.java:132)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.NullPointerException
at com.jayjaudian.warehousemanagement.activity.AddCategory.onActivityResult(AddCategory.java:148)
at android.app.Activity.dispatchActivityResult(Activity.java)
... 13 more

2 个答案:

答案 0 :(得分:0)

我知道有点晚了,但万一有人需要它

您应该使用输入流来获取Uri,类似这样的

InputStream is = getContentResolver().openInputStream(data.getData());

然后

bitmap = BitmapFactory.decodeStream(is);

它与我合作

答案 1 :(得分:0)

更改此行

bitmap = MediaStore.Images.Media.getBitmap(getContentResolver(),filePath);
imageView.setImageBitmap(bitmap);

并使用Glide

Glide.with(this)
                .load(uri)
                .dontAnimate()
                .placeholder(Drawable)
                .into(ImageView);