2017-04-13 112 views
0

我想发送图像到我的服务器。我通过在LINK安卓图像上传到服务器从相机错误

考虑看看在教程做这个但是我需要发送照片从相机拍摄,而不是画廊,所以我做了一些变化,我得到这样一个错误:

致命异常:主要 进程:com.example.audriusalekna.camerapht,PID:25792 java.lang.RuntimeException:传递结果失败ResultInfo {who = null,request = 1,result = -1,data = Intent {act = inline-data(has extras)}} to activity {com.example.audriusalekna.camerapht/com.example.audriusalekna.camerapht.MainActivity}:java.lang.NullPointerException:试图调用虚拟方法'boolea n android.graphics.Bitmap.compress(android.graphics.Bitmap $ CompressFormat,int,java.io.OutputStream)'在android.app.ActivityThread.deliverResults(ActivityThread.java:3887) 上的null对象引用 .app.ActivityThread.handleSendResult(ActivityThread.java:3930) at android.app.ActivityThread.access $ 1300(ActivityThread.java:178) at android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1561) at android.os.Handler.dispatchMessage(Handler.java:111) at android.os.Looper.loop(Looper.java:194) at android.app.ActivityThread.main(ActivityThread.java:5692) 在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:959) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:754) 引发:java.lang.NullPointerException:尝试调用虚拟方法'boolean android.graphics.Bitmap.compress(android .graphics.Bitmap $ CompressFormat,int,java.io.OutputStream)'在空对象引用 at com.example.audriusalekna.camerapht.MainActivity.onActivityResult(MainActivity.java:70) at android.app.Activity.dispatchActivityResult (Activity.java:6346) at android.app.ActivityThread.deliverResults(ActivityThread.java:3883) at android.app.ActivityThread.handleSendResult(ActivityThread.java:3930) at android.app.ActivityThread.access $ 1300(ActivityThread.java:178) at android.app.ActivityThread $ h.handleMessage(ActivityThread.java:1561) at android.os.Handler.dispatchMessage(Handler.java:111) at android.os.Looper.loop(Looper.java:194) at android.app.ActivityThread.main(ActivityThread.java:5692) at java.lang.reflect.Method.invoke(Native Method) at java.lang.reflect.Method.invoke(Method.java:372)

从MainActivity我的代码是在这里:

package com.example.audriusalekna.camerapht; 
 

 
import android.app.Activity; 
 
import android.content.Intent; 
 
import android.content.pm.PackageManager; 
 
import android.graphics.Bitmap; 
 
import android.graphics.BitmapFactory; 
 
import android.graphics.Canvas; 
 
import android.graphics.Color; 
 
import android.graphics.Paint; 
 
import android.graphics.PorterDuff; 
 
import android.graphics.PorterDuffXfermode; 
 
import android.net.Uri; 
 
import android.provider.MediaStore; 
 
import android.support.v7.app.AppCompatActivity; 
 
import android.os.Bundle; 
 
import android.util.Base64; 
 
import android.view.View; 
 
import android.widget.Button; 
 
import android.widget.ImageView; 
 
import android.widget.Toast; 
 

 
import com.android.volley.AuthFailureError; 
 
import com.android.volley.Request; 
 
import com.android.volley.RequestQueue; 
 
import com.android.volley.Response; 
 
import com.android.volley.VolleyError; 
 
import com.android.volley.toolbox.StringRequest; 
 
import com.android.volley.toolbox.Volley; 
 

 
import java.io.ByteArrayOutputStream; 
 
import java.util.HashMap; 
 
import java.util.Map; 
 

 
import static android.R.attr.bitmap; 
 
import static android.R.attr.x; 
 
import static android.R.attr.y; 
 
import static android.provider.ContactsContract.CommonDataKinds.Website.URL; 
 

 

 
public class MainActivity extends AppCompatActivity { 
 
    static final int REQUEST_IMAGE_CAPTURE = 1; 
 
    private Uri fileUri; 
 
    private ImageView imageView; 
 
    Bitmap bitmap; 
 

 
    @Override 
 
    protected void onCreate(Bundle savedInstanceState) { 
 
     super.onCreate(savedInstanceState); 
 
     setContentView(R.layout.activity_main); 
 

 
     Button cameraBtn = (Button) findViewById(R.id.push_button); 
 
     imageView = (ImageView)findViewById(R.id.imageTest); 
 

 
     cameraBtn.setOnClickListener(new View.OnClickListener() { 
 
      @Override 
 
      public void onClick(View v) { 
 
       Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); 
 
       startActivityForResult(cameraIntent, REQUEST_IMAGE_CAPTURE); 
 
      } 
 
     }); 
 
    } 
 

 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
 
     if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == Activity.RESULT_OK) { 
 
      Bitmap photo = (Bitmap) data.getExtras().get("data"); 
 
      imageView.setImageBitmap(photo); 
 

 
      ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
 
      bitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos); 
 
      byte[] imageBytes = baos.toByteArray(); 
 
      final String imageString = Base64.encodeToString(imageBytes, Base64.DEFAULT); 
 

 
      //sending image to server 
 
      StringRequest request = new StringRequest(Request.Method.POST, URL, new Response.Listener<String>(){ 
 
       @Override 
 
       public void onResponse(String s) { 
 

 
        if(s.equals("true")){ 
 
         Toast.makeText(MainActivity.this, "Uploaded Successful", Toast.LENGTH_LONG).show(); 
 
        } 
 
        else{ 
 
         Toast.makeText(MainActivity.this, "Some error occurred!", Toast.LENGTH_LONG).show(); 
 
        } 
 
       } 
 
      },new Response.ErrorListener(){ 
 
       @Override 
 
       public void onErrorResponse(VolleyError volleyError) { 
 
        Toast.makeText(MainActivity.this, "Some error occurred -> "+volleyError, Toast.LENGTH_LONG).show();; 
 
       } 
 
      }) { 
 
       //adding parameters to send 
 
       @Override 
 
       protected Map<String, String> getParams() throws AuthFailureError { 
 
        Map<String, String> parameters = new HashMap<String, String>(); 
 
        parameters.put("image", imageString); 
 
        return parameters; 
 
       } 
 
      }; 
 

 
      RequestQueue rQueue = Volley.newRequestQueue(MainActivity.this); 
 
      rQueue.add(request); 
 

 
     } 
 
     if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == RESULT_OK && data != null && data.getData() != null) { 
 
      Uri filePath = data.getData(); 
 

 
      try { 
 
       //getting image from gallery 
 
       bitmap = MediaStore.Images.Media.getBitmap(getContentResolver(), filePath); 
 

 
       //Setting image to ImageView 
 
       imageView.setImageBitmap(bitmap); 
 
      } catch (Exception e) { 
 
       e.printStackTrace(); 
 
      } 
 
     } 
 
    } 
 
}

+0

当您发送照片时,您是否在“ImageView”中看到它? – Guillaume

+0

我认为这个链接帮助完全为你http://stackoverflow.com/questions/8373755/java-lang-runtimeexception-failure-delivering-result-resultinfowho-null-reque –

+0

'java.lang.NullPointerException:试图调用虚拟方法'布尔android.graphics.Bitmap.compress(android.graphics.Bitmap $ CompressFormat,int,java.io.OutputStream)'在空对象引用'。采取你的措施。 – greenapps

回答

0

你的位为空,为了做你需要,你想要什么,将文件保存localy,比发送。 在您的onclick调用相机意图这样做:

Intent cameraIntent = new Intent("android.media.action.IMAGE_CAPTURE"); 
File file = new File(YOUR_FILE_PATH + "/FILE.jpg"); 
cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(file)); 
startActivityForResult(cameraIntent, REQUEST_IMAGE_CAPTURE); 

后来从这样的路径onresult采取文件:

File f = new File(YOUR_FILE_PATH + "/FILE.jpg"); 
Bitmap bitmap=null; 
BitmapFactory.Options options = new BitmapFactory.Options(); 
options.inPreferredConfig = Bitmap.Config.ARGB_8888; 
try { 
    bitmap = BitmapFactory.decodeStream(new FileInputStream(f), null, options); 
} catch (FileNotFoundException e) { 
    e.printStackTrace(); 
} 
imageView.setImageBitmap(bitmap); 

希望它能帮助。

0

@greenapps解决方案工作!我只是改变了bitmap.compress(Bitmap.CompressFormat.JPEG,100,baos); to photo.compress(Bitmap.CompressFormat.JPEG,100,baos);

+0

请不要把它当成自己的答案。去掉它。相反,如果您认为答案应该在那里,您应该邀请评论者发表评论作为答案。 – greenapps