我从教程Android Upload Image to Server using Volley Tutorial修改
在本教程中,当用户选择图像时,脚本直接上传到服务器。因此,我修改了当用户选择一个图像时,该图像首先显示在imageview上,然后,当用户单击“ sendtoserver”按钮时,该图像将与另一个EditText发送到服务器。
首先,我完成了选择图像按钮,并且我选择的图像显示在imageview上。
第二秒,当我单击“ sendtoserver”按钮时,出现关于getContentResolver()的错误,这里是我的MainActivity代码
package com.example.celmira.uploadgambar;
import android.Manifest;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.graphics.Bitmap;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.provider.MediaStore;
import android.provider.Settings;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.Toast;
import com.android.volley.AuthFailureError;
import com.android.volley.NetworkResponse;
import com.android.volley.Request;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.Volley;
import com.squareup.picasso.Picasso;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
public class MainActivity extends AppCompatActivity {
//ImageView to display image selected
ImageView imageView;
//edittext for getting the tags input
EditText editTextTags;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main_activity);
//initializing views
imageView = (ImageView) findViewById(R.id.imageView);
editTextTags = (EditText) findViewById(R.id.editTextTags);
//mengecek permission, jika blm diijinkan, maka buka setting atau keluar apps
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && ContextCompat.checkSelfPermission(this,
Manifest.permission.READ_EXTERNAL_STORAGE)
!= PackageManager.PERMISSION_GRANTED) {
Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS, Uri.parse("package:" + getPackageName()));
finish();
startActivity(intent);
return;
}
//get image from gallery when clicked
findViewById(R.id.buttonUploadImage).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//if the tags edittext is empty
//we will throw input error
if (editTextTags.getText().toString().trim().isEmpty()) {
editTextTags.setError("Enter tags first");
editTextTags.requestFocus();
return;
}
//if everything is ok we will open image chooser
Intent i = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
startActivityForResult(i, 100);
}
});
// SENDING IMAGE AND TAG TO SERVER WHEN BUTTON sendtoserver clicked
findViewById(R.id.sendtoserver).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Uri imageUri = getIntent().getData();
try {
//getting bitmap object from uri
Bitmap bitmap = MediaStore.Images.Media.getBitmap(getContentResolver(), imageUri);
Log.d("eek",bitmap.toString());
//function to send to server
uploadBitmap(bitmap);
} catch (IOException e) {
e.printStackTrace();
}
}
});
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == 100 && resultCode == RESULT_OK && data != null) {
//getting the image Uri
Uri imageUri = data.getData();
try {
//getting bitmap object from uri
Bitmap bitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(), imageUri);
//displaying selected image to imageview
Picasso.get().load(imageUri).into(imageView);
} catch (IOException e) {
e.printStackTrace();
}
}
}
/*
* The method is taking Bitmap as an argument
* then it will return the byte[] array for the given bitmap
* and we will send this array to the server
* here we are using PNG Compression with 80% quality
* you can give quality between 0 to 100
* 0 means worse quality
* 100 means best quality
* */
public byte[] getFileDataFromDrawable(Bitmap bitmap) {
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.PNG, 80, byteArrayOutputStream);
return byteArrayOutputStream.toByteArray();
}
private void uploadBitmap(final Bitmap bitmap) {
//getting the tag from the edittext
final String tags = editTextTags.getText().toString().trim();
//our custom volley request
VolleyMultipartRequest volleyMultipartRequest = new VolleyMultipartRequest(Request.Method.POST, "http://192.168.166.2/MyApi/Api.php?apicall=uploadpic",
new Response.Listener<NetworkResponse>() {
@Override
public void onResponse(NetworkResponse response) {
try {
JSONObject obj = new JSONObject(new String(response.data));
Toast.makeText(getApplicationContext(), obj.getString("message"), Toast.LENGTH_SHORT).show();
} catch (JSONException e) {
e.printStackTrace();
}
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Toast.makeText(getApplicationContext(), error.getMessage(), Toast.LENGTH_SHORT).show();
}
}) {
/*
* If you want to add more parameters with the image
* you can do it here
* here we have only one parameter with the image
* which is tags
* */
@Override
protected Map<String, String> getParams() throws AuthFailureError {
Map<String, String> params = new HashMap<>();
params.put("tags", tags);
return params;
}
/*
* Here we are passing image by renaming it with a unique name
* */
@Override
protected Map<String, DataPart> getByteData() {
Map<String, DataPart> params = new HashMap<>();
long imagename = System.currentTimeMillis();
params.put("pic", new DataPart(imagename + ".png", getFileDataFromDrawable(bitmap)));
return params;
}
};
//adding the request to volley
Volley.newRequestQueue(this).add(volleyMultipartRequest);
}
}
,这里是引起错误的脚本
Bitmap bitmap = MediaStore.Images.Media.getBitmap(getContentResolver(), imageUri);
这是什么错误消息
FATAL EXCEPTION: main
java.lang.NullPointerException
at android.content.ContentResolver.openInputStream(ContentResolver.java:481)
at android.provider.MediaStore$Images$Media.getBitmap(MediaStore.java:792)
at com.example.celmira.uploadgambar.MainActivity$2.onClick(MainActivity.java:94)
如何获取可以传递给MediaStore.Images.Media.getBitmap()的getContentResolver()
答案 0 :(得分:1)
要在选择iamge后上传:
将uploadBitmap(bitmap);
移至onActivityResult()
点击按钮后上传:
首先创建全局图片网址
private Uri imageUri;
在代码上方
与您一样在onActivityResult
中填写
imageUri = data.getData();
并在通话按钮时发送
findViewById(R.id.sendtoserver).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//THIS LINE REMOVED
//Uri imageUri = getIntent().getData();
try {
//getting bitmap object from uri
Bitmap bitmap = MediaStore.Images.Media.getBitmap(getContentResolver(), imageUri);
Log.d("eek",bitmap.toString());
//function to send to server
uploadBitmap(bitmap);
} catch (IOException e) {
e.printStackTrace();
}
}
});