اذهب إلى المحتوى
  • 0

كيف يمكن إضافة progress bar إلى كود الرفع باستخدام مكتبة Volley في تطبيق Android؟

Drive Man

السؤال


@SuppressWarnings("ALL")
public class VolleyMultipartRequest extends Request<NetworkResponse> {

    private final String twoHyphens = "--";
    private final String lineEnd = "\r\n";
    private final String boundary = "apiclient-" + System.currentTimeMillis();


    private Response.Listener<NetworkResponse> mListener;
    private Response.ErrorListener mErrorListener;
    private Map<String, String> mHeaders;

    public VolleyMultipartRequest(int method, String url,
                                  Response.Listener<NetworkResponse> listener,
                                  Response.ErrorListener errorListener) {
        super(method, url, errorListener);
        this.mListener = listener;
        this.mErrorListener = errorListener;
    }

    @Override
    public Map<String, String> getHeaders() throws AuthFailureError {
        return (mHeaders != null) ? mHeaders : super.getHeaders();
    }

    @Override
    public String getBodyContentType() {
        return "multipart/form-data;boundary=" + boundary;

    }

    @Override
    public byte[] getBody() throws AuthFailureError {
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        DataOutputStream dos = new DataOutputStream(bos);

        try {
            // populate text payload
            Map<String, String> params = getParams();

            if (params != null && params.size() > 0) {
                textParse(dos, params, getParamsEncoding().trim());


            }

            // populate data byte payload
            Map<String, DataPart> data = getByteData();
            if (data != null && data.size() > 0) {
                dataParse(dos, data);
            }

            // close multipart form data after text and file data
            dos.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd);

            return bos.toByteArray();
        } catch (IOException e) {
            e.printStackTrace();

        }
        return null;
    }

    /**
     * Custom method handle data payload.
     *
     * @return Map data part label with data byte
     * @throws AuthFailureError
     */
    protected Map<String, DataPart> getByteData() throws AuthFailureError {
        return null;
    }

    @Override
    protected Response<NetworkResponse> parseNetworkResponse(NetworkResponse response) {
        try {
            return Response.success(
                    response,
                    HttpHeaderParser.parseCacheHeaders(response));
        } catch (Exception e) {
            return Response.error(new ParseError(e));
        }
    }

    @Override
    protected void deliverResponse(NetworkResponse response) {
        mListener.onResponse(response);
    }

    @Override
    public void deliverError(VolleyError error) {
        mErrorListener.onErrorResponse(error);
    }

    /**
     * Parse string map into data output stream by key and value.
     *
     * @param dataOutputStream data output stream handle string parsing
     * @param params           string inputs collection
     * @param encoding         encode the inputs, default UTF-8
     * @throws IOException
     */
    private void textParse(DataOutputStream dataOutputStream, Map<String, String> params, String encoding) throws IOException {

        try {
            for (Map.Entry<String, String> entry : params.entrySet()) {
                buildTextPart(dataOutputStream, entry.getKey(), entry.getValue());
            }
        } catch (UnsupportedEncodingException uee) {
            throw new RuntimeException("Encoding not supported: " + encoding, uee);
        }
    }

    /**
     * Parse data into data output stream.
     *
     * @param dataOutputStream data output stream handle file attachment
     * @param data             loop through data
     * @throws IOException
     */
    private void dataParse(DataOutputStream dataOutputStream, Map<String, DataPart> data) throws IOException {
        for (Map.Entry<String, DataPart> entry : data.entrySet()) {
            buildDataPart(dataOutputStream, entry.getValue(), entry.getKey());
        }
    }

    /**
     * Write string data into header and data output stream.
     *
     * @param dataOutputStream data output stream handle string parsing
     * @param parameterName    name of input
     * @param parameterValue   value of input
     * @throws IOException
     */
    private void buildTextPart(DataOutputStream dataOutputStream, String parameterName, String parameterValue) throws IOException {
        dataOutputStream.writeBytes(twoHyphens + boundary + lineEnd);
        dataOutputStream.writeBytes("Content-Disposition: form-data; name=\"");
        dataOutputStream.write(parameterName.getBytes("UTF-8"));
        dataOutputStream.writeBytes(lineEnd);
        dataOutputStream.writeBytes("Content-Type: text/plain; charset=UTF-8" + lineEnd);
        dataOutputStream.writeBytes(lineEnd);
        dataOutputStream.write(parameterValue.getBytes("UTF-8"));
        dataOutputStream.writeBytes(lineEnd);
    }

    /**
     * Write data file into header and data output stream.
     *
     * @param dataOutputStream data output stream handle data parsing
     * @param dataFile         data byte as DataPart from collection
     * @param inputName        name of data input
     * @throws IOException
     */
    private void buildDataPart(DataOutputStream dataOutputStream, DataPart dataFile, String inputName) throws IOException {
        dataOutputStream.writeBytes(twoHyphens + boundary + lineEnd);
        dataOutputStream.writeBytes("Content-Disposition: form-data; name=\"" +
                inputName + "\"; filename=\"" + dataFile.getFileName() + "\"" + lineEnd);
        if (dataFile.getType() != null && !dataFile.getType().trim().isEmpty()) {
            dataOutputStream.writeBytes("Content-Type: " + dataFile.getType() + lineEnd);
        }
        dataOutputStream.writeBytes(lineEnd);

        ByteArrayInputStream fileInputStream = new ByteArrayInputStream(dataFile.getContent());
        int bytesAvailable = fileInputStream.available();

        int maxBufferSize = 1024 * 1024;
        int bufferSize = Math.min(bytesAvailable, maxBufferSize);
        byte[] buffer = new byte[bufferSize];

        int bytesRead = fileInputStream.read(buffer, 0, bufferSize);

        while (bytesRead > 0) {

            dataOutputStream.write(buffer, 0, bufferSize);

            bytesAvailable = fileInputStream.available();
            bufferSize = Math.min(bytesAvailable, maxBufferSize);
            bytesRead = fileInputStream.read(buffer, 0, bufferSize);

        }

        dataOutputStream.writeBytes(lineEnd);
    }

    class DataPart {
        private String fileName;
        private byte[] content;
        private String type;

        public DataPart() {
        }

        DataPart(String name, byte[] data) {
            fileName = name;
            content = data;
        }

        String getFileName() {
            return fileName;
        }

        byte[] getContent() {
            return content;
        }

        String getType() {
            return type;
        }

    }
}

 

    private void uploadPDF(final String pdfname, Uri pdffile){
         progressDialog = ProgressDialog.show(uploadved.this, "جارى ارسال الفيديو", "برجاء الانتظار", false, false);


        InputStream iStream = null;
        try {

            iStream = getContentResolver().openInputStream(pdffile);
            final byte[] inputData = getBytes(iStream);

            VolleyMultipartRequest volleyMultipartRequest = new VolleyMultipartRequest(Request.Method.POST, URLphp,
                    new Response.Listener<NetworkResponse>() {
                        @Override
                        public void onResponse(NetworkResponse response) {
                            Log.d("ressssssoo",new String(response.data));
                            Toast.makeText(uploadved.this,new String(response.data), Toast.LENGTH_SHORT).show();
                            progressDialog.dismiss();
                            rQueue.getCache().clear();
                            try {
                                JSONObject jsonObject = new JSONObject(new String(response.data));
                                Toast.makeText(getApplicationContext(), response.toString(), Toast.LENGTH_SHORT).show();

                            } catch (JSONException e) {
                                Toast.makeText(uploadved.this, "", Toast.LENGTH_SHORT).show();
                            }
                        }
                    },
                    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("rw", shall.getInstance(uploadved.this).getuserShow());
                    params.put("imrwedagsh", shall.getInstance(uploadved.this).getimage());
                    params.put("idrewdus", shall.getInstance(uploadved.this).getid());
                    params.put("tirwgfdtel",enwanvido);
                    return params;
                }

                /*
                 *pass files using below method
                 * */
                @Override
                protected Map<String, DataPart> getByteData() {
                    Map<String, DataPart> params = new HashMap<>();
                    params.put("uyt", new DataPart(pdfname ,inputData));
                    Log.d("testerget work","workingpartdata");
                    return params;
                }
            };



            volleyMultipartRequest.setRetryPolicy(new DefaultRetryPolicy(
                    0,
                    DefaultRetryPolicy.DEFAULT_MAX_RETRIES,
                    DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
            rQueue = Volley.newRequestQueue(uploadved.this);
            rQueue.add(volleyMultipartRequest);



        } catch (FileNotFoundException e) {
            Toast.makeText(this, "لم يتم التعرف على الملف ", Toast.LENGTH_SHORT).show();
        } catch (IOException e) {
            Toast.makeText(this, "هناك مشكلة بالانترنت  ", Toast.LENGTH_SHORT).show();
        }


    }

هاتان الصفحتان للتعامل مع الخدمة المطلوبة

تم التعديل في بواسطة Mustafa Suleiman
تعديل عنوان السؤال
رابط هذا التعليق
شارك على الشبكات الإجتماعية

Recommended Posts

  • 0

تستطيع إضافة progress bar للكود عن طريق إنشاء واجهة المستخدم وجعلها تستخدم هذا الكود، ثم يمكن عرض progress bar لمستخدمي التطبيق لإظهار تقدم عملية الرفع.

ثم استخدام الكود المعطى في حدث زر الرفع (upload)، ومن ثم تحديث progress bar بشكل منتظم لإظهار تقدم عملية الرفع. ويمكن ذلك بإضافة شرطات التقدم في مخرجات الكود، مثلاً، حاول إضافة حدث يقوم بتحديث progress bar بناءً على عدد البايتات التي تم رفعها.

 

وتستطيع الاطلاع على مقالات أو دليل مطورين مثل هذا الدليل لمعرفة المزيد حول إضافة progress bar في تطبيقات Android:

https://developer.android.com/reference/android/widget/ProgressBar

وإليك مثال بسيط يستخدم مكتبة Volley لإجراء طلب HTTP POST مع تمكين ProgressBar عند الرفع:

public class MainActivity extends AppCompatActivity {
    private Button uploadButton;
    private ProgressBar progressBar;

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

        uploadButton = findViewById(R.id.upload_button);
        progressBar = findViewById(R.id.progress_bar);

        uploadButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // Create a multipart request using Volley
                VolleyMultipartRequest request = new VolleyMultipartRequest(Request.Method.POST, UPLOAD_URL, new Response.Listener<NetworkResponse>() {
                    @Override
                    public void onResponse(NetworkResponse response) {
                        // Handle successful response
                    }
                }, new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError error) {
                        // Handle error
                    }
                }) {
                    @Override
                    protected Map<String, DataPart> getByteData() {
                        // Add file to request
                        Map<String, DataPart> params = new HashMap<>();
                        params.put("file", new DataPart("file.jpg", getFileDataFromDrawable(getBaseContext(), R.drawable.image), "image/jpeg"));
                        return params;
                    }

                    @Override
                    protected Response<NetworkResponse> parseNetworkResponse(NetworkResponse response) {
                        // Update progress bar based on response
                        int percentage = (int) (((float) response.uploadedBytes / (float) response.totalBytes) * 100);
                        progressBar.setProgress(percentage);
                        return super.parseNetworkResponse(response);
                    }
                };

                // Add request to the queue
                VolleySingleton.getInstance(getBaseContext()).addToRequestQueue(request);
            }
        });
    }

    private byte[] getFileDataFromDrawable(Context context, int id) {
        Drawable drawable = ContextCompat.getDrawable(context, id);
        Bitmap bitmap = ((BitmapDrawable) drawable).getBitmap();
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
        bitmap.compress(Bitmap.CompressFormat.JPEG, 80, byteArrayOutputStream);
        return byteArrayOutputStream.toByteArray();
    }
}

وعليك باستبدال UPLOAD_URL بعنوان URL الخاص بخادم الرفع الخاص بك و R.drawable.image بمورد الصورة الخاصة بك.

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0

يمكن إضافة progress bar إلى كود الرفع باستخدام مكتبة Volley في تطبيق Android باستخدام الـ RequestQueue الخاصة بـ Volley وباستخدام الـ ProgressListener لمراقبة التقدم في الرفع.

فيما يلي خطوات إضافة progress bar إلى كود الرفع باستخدام مكتبة Volley في تطبيق Android:

  • تحديد الـ RequestQueue الخاصة بـ Volley وإضافة الإرسال إليها:
RequestQueue queue = Volley.newRequestQueue(this);
String url = "http://example.com/upload.php";

// إنشاء الـ StringRequest
StringRequest stringRequest = new StringRequest(Request.Method.POST, url,
        new Response.Listener<String>() {
            @Override
            public void onResponse(String response) {
                // تنفيذ الشيفرة عند الانتهاء
            }
        }, new Response.ErrorListener() {
    @Override
    public void onErrorResponse(VolleyError error) {
        // تنفيذ الشيفرة عند حدوث خطأ
    }
}) {
    @Override
    protected Map<String, String> getParams() {
        // إضافة المعلومات المطلوبة للرفع هنا
        Map<String, String> params = new HashMap<>();
        params.put("key", "value");
        return params;
    }
};

// إضافة الـ StringRequest إلى الـ RequestQueue
queue.add(stringRequest);
  • إضافة ProgressListener لرصد التقدم في الرفع:
    final ProgressBar progressBar = findViewById(R.id.progress_bar); // تعريف الـ ProgressBar
    
    // إضافة الـ ProgressListener للـ StringRequest
    stringRequest.setRetryPolicy(new DefaultRetryPolicy(
            0,
            DefaultRetryPolicy.DEFAULT_MAX_RETRIES,
            DefaultRetryPolicy.DEFAULT_BACKOFF_MULT)) {
    
        @Override
        public void deliverError(VolleyError error) {
            super.deliverError(error);
            // إخفاء ProgressBar عند حدوث خطأ
            progressBar.setVisibility(View.GONE);
        }
    
        @Override
        protected void deliverResponse(String response) {
            super.deliverResponse(response);
            // إخفاء ProgressBar عند الانتهاء
            progressBar.setVisibility(View.GONE);
        }
    
        @Override
        public void deliverProgress(long downloaded, long total) {
            super.deliverProgress(downloaded, total);
            // تعديل قيمة ProgressBar بناءً على التقدم في الرفع
            progressBar.setProgress((int) ((downloaded / (float) total) * 100));
        }
    };
  • إظهار ProgressBar قبل البدء في الرفع، وإخفائه بعد الانتهاء:

    // إظهار ProgressBar قبل البدء في الرفع
    progressBar.setVisibility(View.VISIBLE);
    
    // إضافة الـ StringRequest إلى الـ RequestQueue
    queue.add(stringRequest);

     

رابط هذا التعليق
شارك على الشبكات الإجتماعية

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...