我想在donutProgress栏中显示上传百分比。我有2节课。一种是用要上传的图像文件完成所有工作,另一种是我扩展AsyncTask以显示进度的第二类。
现在在第二节课上,我尝试使用Volly将其发布到我的应用服务器,但是POST似乎根本没有发送任何数据。我已经检查了所有参数是否包含所有必需的值,但仍然收到com.android.volly.ClientError;。在github文档中,它说这是由4xx错误的网络引起的,但是由php页面未收到任何发布数据引起的。
这是完整的代码。
package com.mymss.mymss;
import static com.mymss.mymss.MarksFilter.changeBackArrowColor;
public class CaptureImage extends AppCompatActivity{
Spinner s1,s2,s3;
Button button;
Boolean flag;
ImageButton capture,upload,next,previous;
ImageView imageContainer;
TextView studentInfo;
Toolbar toolbar;
private static String StudentId,imgStr,sCode,defaultSession;
DonutProgress donutProgress;
String[] clas,sec,roll,cid,sid,rid,stdid,resultSet,rSetId;
String url="",getSecUrl,getRollUrl,sID,sName,sMob,resultClass,resultSec,resultRoll,getStdUrl;
ProgressDialog progressDialog;
JSONObject jsonObject;
JSONArray jsonArray;
ArrayAdapter<String> arrayAdapter,aD2,aD3;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_capture_image);
this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
defaultSession="2018";
flag = false;
s1 = findViewById(R.id.spClass);
s2 = findViewById(R.id.spSec);
s3 = findViewById(R.id.spRoll);
button = findViewById(R.id.btnCaptureGet);
imageContainer = findViewById(R.id.ImageView_image);
previous = findViewById(R.id.leftBtn2);
next = findViewById(R.id.rightBtn2);
capture = findViewById(R.id.captureImage);
donutProgress = findViewById(R.id.donut_progress1);
upload = findViewById(R.id.upload);
studentInfo = findViewById(R.id.imageName);
toolbar = findViewById(R.id.toolbarImage);
imageContainer.setVisibility(View.GONE);
previous.setVisibility(View.GONE);
next.setVisibility(View.GONE);
studentInfo.setVisibility(View.GONE);
button.setVisibility(View.GONE);
capture.setVisibility(View.GONE);
upload.setVisibility(View.GONE);
setSupportActionBar(toolbar);
final UploadFileToServer uploadFileToServer;
getSupportActionBar().setHomeAsUpIndicator(changeBackArrowColor(this, Color.rgb(2, 2, 250)));
toolbar.setNavigationOnClickListener(
new View.OnClickListener() {
@Override
public void onClick(View view) {
onBackPressed();
}
}
);
Intent intent = getIntent();
try {
sID = intent.getExtras().getString("ID");
sCode = intent.getExtras().getString("School");
sName = intent.getExtras().getString("Name");
sMob = intent.getExtras().getString("Mobile");
}
catch (NullPointerException e)
{
new AlertDialog.Builder(CaptureImage.this)
.setTitle("ERROR !!")
.setMessage("Error Code = "+e.toString())
.setCancelable(false)
.setIcon(R.drawable.ic_logo)
.setPositiveButton("OK", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.cancel();
//finishAffinity();
//System.exit(0);
}
}).show();
}
url = "https://www.mymss.com/Android/photo.php?action=getclass&session="+defaultSession+"&code="+sCode+"&user="+sID;
callNet(url,"Class");
s1.setOnItemSelectedListener(
new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {
try {
Object item = adapterView.getItemAtPosition(i);
if (item != null) {
//Toast.makeText(TeacherLand.this, item.toString() + " selected with mobile no "+number[i],
// Toast.LENGTH_SHORT).show();
resultClass = cid[i];
//examName = exam[i];
if(resultClass.compareToIgnoreCase("0")!=0)
{
getSecUrl = "https://www.mymss.com/Android/photo.php?action=secexam&session="+defaultSession+"&code="+sCode+"&user="+sID+"&element_1="+resultClass;
callNet(getSecUrl,"Section");
}
}
}
catch (NullPointerException e)
{
Toast.makeText(CaptureImage.this,"Error Block",Toast.LENGTH_SHORT).show();
}
}
@Override
public void onNothingSelected(AdapterView<?> adapterView) {
}
}
);
s2.setOnItemSelectedListener(
new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {
try {
Object item = adapterView.getItemAtPosition(i);
if (item != null) {
//Toast.makeText(TeacherLand.this, item.toString() + " selected with mobile no "+number[i],
// Toast.LENGTH_SHORT).show();
resultSec = sid[i];
//examName = exam[i];
if(resultSec.compareToIgnoreCase("0")!=0)
{
getRollUrl = "https://www.mymss.com/Android/photo.php?action=allroll&session="+defaultSession+"&code="+sCode+"&user="+sID+"&class="+resultClass+"&sec="+resultSec;
callNet(getRollUrl,"Roll");
}
}
}
catch (NullPointerException e)
{
Toast.makeText(CaptureImage.this,"Error Block",Toast.LENGTH_SHORT).show();
}
}
@Override
public void onNothingSelected(AdapterView<?> adapterView) {
}
}
);
s3.setOnItemSelectedListener(
new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {
try {
Object item = adapterView.getItemAtPosition(i);
if (item != null) {
//Toast.makeText(TeacherLand.this, item.toString() + " selected with mobile no "+number[i],
// Toast.LENGTH_SHORT).show();
resultRoll = rid[i];
StudentId = stdid[i];
//examName = exam[i];
if(resultRoll.compareToIgnoreCase("0")!=0)
{
getStdUrl = "https://www.mymss.com/Android/photo.php?action=get&session="+defaultSession+"&code="+sCode+"&user="+sID+"&stdid="+stdid[i];
//callNet(getRollUrl,"Roll");
button.setVisibility(View.VISIBLE);
}
}
}
catch (NullPointerException e)
{
Toast.makeText(CaptureImage.this,"Error Block",Toast.LENGTH_SHORT).show();
}
}
@Override
public void onNothingSelected(AdapterView<?> adapterView) {
}
}
);
button.setOnClickListener(
new View.OnClickListener() {
@Override
public void onClick(View view) {
callNet(getStdUrl,"get");
//Toast.makeText(getApplicationContext(),getStdUrl,Toast.LENGTH_LONG).show();
}
}
);
capture.setOnClickListener(
new View.OnClickListener() {
@Override
public void onClick(View view) {
CropImage.activity()
.setActivityTitle("ImageCrop")
.setAspectRatio(1,1)
.setMultiTouchEnabled(true)
.start(CaptureImage.this);
}
}
);
uploadFileToServer = new UploadFileToServer(this,imgStr,sCode,defaultSession,StudentId);
upload.setOnClickListener(
new View.OnClickListener() {
@Override
public void onClick(View view) {
uploadFileToServer.execute();
//new UploadFileToServer().execute();
//uploadImage("blank",imgStr);
}
}
);
}
public static String getImgStr()
{
return imgStr;
}
public static String getsCode()
{
return sCode;
}
public static String getDefaultSession()
{
return defaultSession;
}
public static String getStudentId()
{
return StudentId;
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(requestCode == CropImage.CROP_IMAGE_ACTIVITY_REQUEST_CODE)
{
CropImage.ActivityResult result = CropImage.getActivityResult(data);
if(requestCode == 203 || requestCode == RESULT_OK)
{
Uri resultUri = result.getUri();
imageContainer.setImageURI(resultUri);
Bitmap bitmap = ((BitmapDrawable)imageContainer.getDrawable()).getBitmap();
imgStr = imageConvert(bitmap);
upload.setVisibility(View.VISIBLE);
}
else if(requestCode == CropImage.CROP_IMAGE_ACTIVITY_RESULT_ERROR_CODE)
{
Exception error = result.getError();
Toast.makeText(getApplicationContext(),""+error,Toast.LENGTH_SHORT).show();
}
}
}
public static Drawable changeBackArrowColor(Context context, int color) {
String resName;
int res;
resName = Build.VERSION.SDK_INT >= 23 ? "abc_ic_ab_back_material" : "abc_ic_ab_back_mtrl_am_alpha";
res = context.getResources().getIdentifier(resName, "drawable", context.getPackageName());
final Drawable upArrow = context.getResources().getDrawable(res);
upArrow.setColorFilter(color, PorterDuff.Mode.SRC_ATOP);
return upArrow;
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.mymenu,menu);
MenuItem menuItem1 = menu.findItem(R.id.sessionCurrent);
MenuItem menuItem2 = menu.findItem(R.id.sessionNext);
if(!menuItem1.isChecked() && !menuItem2.isChecked())
{
menuItem1.setChecked(true);
defaultSession = menuItem1.getTitle().toString();
}
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch(item.getItemId())
{
case R.id.sessionCurrent:
item.setChecked(true);
defaultSession = item.getTitle().toString();
Toast.makeText(getApplicationContext(),"Session changed to "+item.getTitle().toString(),Toast.LENGTH_SHORT).show();
break;
case R.id.sessionNext:
item.setChecked(true);
defaultSession = item.getTitle().toString();
Toast.makeText(getApplicationContext(),"Session changed to "+item.getTitle().toString(),Toast.LENGTH_SHORT).show();
break;
}
return true;
}
private String imageConvert(Bitmap bitmap)
{
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.JPEG,90,byteArrayOutputStream);
byte[] imgBytes = byteArrayOutputStream.toByteArray();
return Base64.encodeToString(imgBytes,Base64.DEFAULT);
}
public void fillPic(String url)
{
View parentLayout = findViewById(android.R.id.content);
Snackbar.make(parentLayout,"Please Wait, Still Loading....... ",Snackbar.LENGTH_LONG)
.setAction("CLOSE", new View.OnClickListener() {
@Override
public void onClick(View view) {
}
}).show();
Picasso.with(getApplicationContext())
.load(url)
.error(R.drawable.question)
.fit()
.into(imageContainer, new Callback() {
@Override
public void onSuccess() {
}
@Override
public void onError() {
View parentLayout = findViewById(android.R.id.content);
Snackbar.make(parentLayout,"Image not available. ",Snackbar.LENGTH_LONG)
.setAction("CLOSE", new View.OnClickListener() {
@Override
public void onClick(View view) {
}
}).show();
}
});
}
}
class UploadFileToServer extends AsyncTask<String, String, String> {
CaptureImage captureImage = new CaptureImage();
DonutProgress donutProgress;
ImageButton upload;
public Activity activity;
String image,code,session,StudentId;
public UploadFileToServer(Activity _activity,String image,String code,String session,String StudentId)
{
this.activity = _activity;
this.image = image;
this.code = code;
this.session = session;
this.StudentId = StudentId;
donutProgress = this.activity.findViewById(R.id.donut_progress1);
upload = this.activity.findViewById(R.id.upload);
}
@Override
protected void onPreExecute() {
// setting progress bar to zero
image = CaptureImage.getImgStr();
code = CaptureImage.getsCode();
session = CaptureImage.getDefaultSession();
StudentId = CaptureImage.getStudentId();
upload.setVisibility(View.GONE);
donutProgress.setVisibility(View.VISIBLE);
super.onPreExecute();
}
@Override
protected void onProgressUpdate(String... progress) {
//Log.d("PROG", progress[0]);
//donut_progress.setProgress(Integer.parseInt(progress[0])); //Updating progress
donutProgress.setProgress(Float.valueOf(progress[0]));
}
@Override
protected String doInBackground(String... args) {
RequestQueue queue = Volley.newRequestQueue(activity);
StringRequest sr = new StringRequest(Request.Method.POST,"https://www.mymss.com/Android/photo.php", new Response.Listener<String>() {
@Override
public void onResponse(String response) {
if (response.compareToIgnoreCase("success")==0) {
activity.runOnUiThread(
new Runnable() {
@Override
public void run() {
//Toast.makeText(activity,"Code = "+code+" , Img = "+image+", Session = "+session,Toast.LENGTH_LONG).show();
Toast.makeText(activity, "Success", Toast.LENGTH_SHORT).show();
}
}
);
}
else {
activity.runOnUiThread(
new Runnable() {
@Override
public void run() {
//Toast.makeText(activity,"Code = "+code+" , Img = "+image+", Session = "+session,Toast.LENGTH_LONG).show();
Toast.makeText(activity, "Failed", Toast.LENGTH_SHORT).show();
}
}
);
}
donutProgress.setVisibility(View.GONE);
upload.setVisibility(View.VISIBLE);
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
new AlertDialog.Builder(activity)
.setTitle("Error")
.setMessage("Invalid Response From Server.[Code = "+error.toString()+"]")
.setCancelable(false)
.setIcon(R.drawable.ic_logo)
.setPositiveButton("OK", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.cancel();
//finishAffinity();
//System.exit(0);
}
}).show();
donutProgress.setVisibility(View.GONE);
}
}){
@Override
protected Map<String,String> getParams(){
Map<String,String> params = new HashMap<String, String>();
params.put("image",image);
params.put("code",code);
params.put("session",session);
params.put("addphoto", StudentId);
return params;
}
@Override
public Map<String, String> getHeaders() throws AuthFailureError {
Map<String,String> params = new HashMap<String, String>();
params.put("Content-Type","application/x-www-form-urlencoded");
return params;
}
};
queue.add(sr);
return null;
}
@Override
protected void onPostExecute(String result) {
//Log.e("Response", "Response from server: " + result);
super.onPostExecute(result);
}
}
这是php代码
<?php
file_put_contents('test.txt', $_POST);
if(isset($_POST['addphoto']))
{
$dir = $_POST['code'];
$session = $_POST['session'];
}
else{
$user = $_GET['user'];
$dir = $_GET['code'];
$session = $_GET['session'];
}
$upOne = realpath(__DIR__ . '/..');
$conn1=odbc_connect("DRIVER={Microsoft Access Driver (*.mdb)};Dbq=$dbName","user","pass");
if(isset($_POST['addphoto'])){
$_POST['addphoto']=intval($_POST['addphoto']);
if($_POST['addphoto']){
$img = $_POST['image'];
$img = str_replace('data:image/jpeg;base64,', '', $img);
$img = str_replace(' ', '+', $img);
$data = base64_decode($img);
$time=time();
$filename=$time.'_'.$_POST['addphoto'].'.jpg';
$file = 'uploads/studentphoto/'.$filename;
$success = file_put_contents($file, $data);
$sql="select StudentId,img from StudentMain where StudentId=".$_POST['addphoto'];
$rs=odbc_exec($conn1,$sql)or die (print odbc_errormsg());
$row=odbc_fetch_array($rs);
if(file_exists("uploads/studentphoto/".$row['img']) && $row['img'])
unlink("uploads/studentphoto/".$row['img']);
$sql = "update StudentMain set img='".$filename."' where StudentId=".$row['StudentId'];
$rs = odbc_exec($conn1,$sql)or die (print odbc_errormsg());
echo 'success';
}
}
?>
这是屏幕截图:
答案 0 :(得分:1)
在“ UploadFileToServer”中定义:
CaptureImage captureImage = new CaptureImage();
然后使用:
image = CaptureImage.getImgStr();
在
protected void onPreExecute() {
在没有向图像字符串赋新值的情况下,我认为这在当时仍然为null。相反,似乎您想将 this 传递给构造函数。
答案 1 :(得分:0)
从Volly中删除getHeaders()方法后,它终于可以工作了。不知道为什么,但是现在工作正常。