【问题标题】:App crashing while trying to send picture to server尝试将图片发送到服务器时应用程序崩溃
【发布时间】:2018-09-03 17:18:44
【问题描述】:

1.当我尝试将我拍摄的图片发送到服务器时,应用程序崩溃了,这表明第 101 行中有一些东西 这就是错误

E/AndroidRuntime: FATAL EXCEPTION: main
              Process: com.example.th3hokage.pfev1, PID: 25157
              java.lang.NullPointerException: Attempt to invoke virtual method 'android.graphics.Bitmap android.graphics.drawable.BitmapDrawable.getBitmap()' on a null object reference
                  at com.example.th3hokage.pfev1.SendPic.ImageUploadToServerFunction(SendPic.java:155)
                  at com.example.th3hokage.pfev1.SendPic$2.onClick(SendPic.java:101)
                  at android.view.View.performClick(View.java:6199)
                  at android.widget.TextView.performClick(TextView.java:11090)
                  at android.view.View$PerformClick.run(View.java:23647)
                  at android.os.Handler.handleCallback(Handler.java:751)
                  at android.os.Handler.dispatchMessage(Handler.java:95)
                  at android.os.Looper.loop(Looper.java:154)
                  at android.app.ActivityThread.main(ActivityThread.java:6682)
                  at java.lang.reflect.Method.invoke(Native Method)
                  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1520)
                  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1410)

2. Send to server 方法的代码和我实例化 ImageView 的 Activity 的顶部,这几乎是整个代码,除了一些辅助方法

   public class SendPic extends Activity {

ImageView imageViewHolder;

EditText imageName;

ProgressDialog progressDialog ;

Intent intent ;

public  static final int RequestPermissionCode  = 1 ;

Bitmap bitmap;

boolean check = true;

String GetImageNameFromEditText;

String ImageNameFieldOnServer = "image_name" ;

String ImagePathFieldOnServer = "image_path" ;

String ImageUploadPathOnSever ="" ;
@Override
protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.send_pic);

Button CaptureImageFromCamera = (Button)findViewById(R.id.button);
 imageViewHolder = (ImageView)findViewById(R.id.imageView);
Button UploadImageToServer = (Button) findViewById(R.id.button2);
 imageName = (EditText)findViewById(R.id.editText);

 EnableRuntimePermissionToAccessCamera();

 CaptureImageFromCamera.setOnClickListener(new View.OnClickListener() {
  @Override
  public void onClick(View view) {

   intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);

    startActivityForResult(intent, 7);

  }
  });


public void ImageUploadToServerFunction() {

    ByteArrayOutputStream byteArrayOutputStreamObject ;

    byteArrayOutputStreamObject = new ByteArrayOutputStream();
    bitmap = ((BitmapDrawable) ImageViewHolder.getDrawable()).getBitmap();

    // Converting bitmap image to jpeg format, so by default image will upload in jpeg format.
    bitmap.compress(Bitmap.CompressFormat.JPEG, 100, 
    byteArrayOutputStreamObject);

    byte[] byteArrayVar = byteArrayOutputStreamObject.toByteArray();

    final String ConvertImage = Base64.encodeToString(byteArrayVar, 
 Base64.DEFAULT);

    class AsyncTaskUploadClass extends AsyncTask<Void,Void,String> {

        @Override
        protected void onPreExecute() {

            super.onPreExecute();

            // Showing progress dialog at image upload time.
            progressDialog = ProgressDialog.show(SendPic.this,"Image is Uploading","Please Wait",false,false);
        }

        @Override
        protected void onPostExecute(String string1) {

            super.onPostExecute(string1);

            // Dismiss the progress dialog after done uploading.
            progressDialog.dismiss();

            // Printing uploading success message coming from server on android app.
            Toast.makeText(SendPic.this,string1,Toast.LENGTH_LONG).show();

            // Setting image as transparent after done uploading.
            ImageViewHolder.setImageResource(android.R.color.transparent);
        }

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

            ImageProcessClass imageProcessClass = new ImageProcessClass();

            HashMap<String,String> HashMapParams = new HashMap<String,String>();

            HashMapParams.put(ImageNameFieldOnServer, GetImageNameFromEditText);

            HashMapParams.put(ImagePathFieldOnServer, ConvertImage);

            String FinalData = imageProcessClass.ImageHttpRequest(ImageUploadPathOnSever, HashMapParams);

            return FinalData;
        }
    }

    AsyncTaskUploadClass AsyncTaskUploadClassOBJ = new AsyncTaskUploadClass();

}

【问题讨论】:

  • 请分享发送到服务器的代码或函数。发送前也要先检查Bitmap的实例是否不为null
  • 空指针异常仅表示您正在尝试使用尚未初始化或设置为空的对象或实例。请确保位图实例是否已正确实例化并且不是 NULL。仍然会建议您分享相关代码以更好地解决您的问题。
  • @Kishan 我刚刚添加了方法的代码

标签: php android image server


【解决方案1】:

你的代码

bitmap = ((BitmapDrawable) ImageViewHolder.getDrawable()).getBitmap();

应该是

ImageView someImage= (ImageView) v.findViewById(R.id.image);
bitmap  = ((BitmapDrawable) someImage.getDrawable()).getBitmap();

您正在访问 ImageViewHolder 类的 getDrawable(),而不是您必须创建的对象。

你不见了:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == RESULT_OK) {
        Bundle extras = data.getExtras();
        Bitmap imageBitmap = (Bitmap) extras.get("data");
        imageViewHolder.setImageBitmap(imageBitmap);
    }
}

只有在 onActivityResult() 中获得图像后,您才应该发送该执行代码以将其发送到服务器。在此之前没有,因为在此之前 ImageView 没有设置 Bitmap。

根据您的代码,REQUEST_IMAGE_CAPTURE 必须等于 7。 即 REQUEST_IMAGE_CAPTURE = 7

修改您的相机捕捉意图,如下所示:

if (intent.resolveActivity(getPackageManager()) != null) {
        startActivityForResult(intent, REQUEST_IMAGE_CAPTURE);
    }

【讨论】:

  • 我已经创建了对象,它是 ImageViewHolder ,它不是一个类
  • 你应该在 ImageView 实例上调用 getDrawable()
  • 我已经这样做了,因为 ImageViewHolder 它已经是 ImageView 的一个实例
  • @C.yasser 请分享您将此 ImageView 实例化为 ImageViewHolder 的代码
  • @C.yasser 您正在使用带有大写 I 的 ImageViewHolder。应该是“imageViewHolder”注意小 I。
猜你喜欢
  • 2018-09-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多