Как отправить путь к файлу изображения на веб-сервере в Android? - PullRequest
0 голосов
/ 08 ноября 2018

Я отправил изображения на веб-сервер, поэтому я не использую метод base64. Я отправил путь к файлу изображений на веб-сервер. Мое требование - выбор изображения из галереи и получение изображения с камеры, которую изображения отправляют на веб-сервер. Эти функциональные возможности работают нормально. Самсунг - устройство, вплоть до зефира. Другое устройство не работает для нижнего и верхнего сегмента, Выбирает изображения из галереи. работает на всех моделях устройств (от нижнего до верхнего уровня) это мой код, пожалуйста, помогите мне.

my onActivityResult:

        protected void onActivityResult(int requestCode, int resultCode, Intent data) {
            if (requestCode == CAMERA_REQUEST) {

                if(data!=null) {

                    Bitmap photo = (Bitmap) data.getExtras().get("data");
                    //imageView.setImageBitmap(photo);
                    txt_complaint_name.setText(complientResponse.getD().get(position).getComplaintCatogoryName());
                    String encodedImage = encodeImage(photo);

                    //final Uri selectedFileUri = Uri.parse(encodedImage);

                    final Uri selectedFileUri = data.getData();
                    selectedFilePath = FilePath.getPath(this,selectedFileUri);
                    Log.i(TAG,"Selected File Path:" + selectedFilePath);

                    if(selectedFilePath != null && !selectedFilePath.equals("")){
    //                        tvFileName.setText(selectedFilePath);
                    }else{
                        Toast.makeText(this,"Cannot upload file to server",Toast.LENGTH_SHORT).show();
                    }


                    //on upload button Click
                    if(selectedFilePath != null){
    //                    dialog = ProgressDialog.show(ComplaintDetailsActivity.this,"","Uploading File...",true);

                        new Thread(new Runnable() {
                            @Override
                            public void run() {
                                //creating new thread to handle Http Operations
    //                            uploadFile(selectedFilePath);
                                uploadFiles(selectedFilePath, selectedFileUri);

                            }
                        }).start();
                    }else{
                        Toast.makeText(ComplaintDetailsActivity.this,"Please choose a File First",Toast.LENGTH_SHORT).show();
                    }


                    Log.d("base64", encodedImage);

                    BitmapFactory.Options options;
                    options = new BitmapFactory.Options();
                    options.inSampleSize = 5;

                    ByteArrayOutputStream baos1 = new ByteArrayOutputStream();

                    if (photo != null) {
                        photo.compress(Bitmap.CompressFormat.JPEG, 10, baos1);
                        byte[] b1 = baos1.toByteArray();

                        String bitmapstring1 = Base64.encodeToString(b1,
                                Base64.NO_WRAP);

                        Log.d("full_string", bitmapstring1);
                        String imageBase64 = bitmapstring1;
                        ComplaintDetailsActivity obj = new ComplaintDetailsActivity();
                        obj.imageVal(bitmapstring1);

                        f = new File(Environment.getExternalStorageDirectory().toString());
                        for (File temp : f.listFiles()) {
                            if (temp.getName().equals("temp.jpg")) {
                                f = temp;
                                break;
                            }
                        }
                        imageuri = f.getAbsolutePath();

                        questionResponse.getD().get(adapterPosition).setImage(imageBase64);
                        adapterQuestionMaster.notifyDataSetChanged();



                    }
                }
            }
            else if (requestCode == GALLERY_REQUEST) {

                super.onActivityResult(requestCode, resultCode, data);
                if(resultCode == Activity.RESULT_OK){

                    if(requestCode == PICK_FILE_REQUEST){
                        if(data == null){
                            //no data present
                            return;
                        }

    //                    Bitmap photo = (Bitmap) data.getExtras().get("data");
    //
    //                    String encodedImage = encodeImage(photo);
    //                    questionResponse.getD().get(adapterPosition).setImage(encodedImage);


                        final Uri selectedFileUri = data.getData();
                        selectedFilePath = FilePath.getPath(this,selectedFileUri);
                        Log.d("Path", selectedFilePath);
                        InputStream imageStream = null;
                        try {
                            imageStream = this.getContentResolver().openInputStream(selectedFileUri);
                        } catch (FileNotFoundException e) {
                            e.printStackTrace();
                        }
                        Bitmap photo = BitmapFactory.decodeStream(imageStream);
                        try
                        {
    //                        Bitmap bitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver() , Uri.parse(selectedFilePath));
                            String encodedImage = encodeImage(photo);
                            Log.d("full_string", encodedImage);
                            Log.d("full_string", "SSSS");
                            BitmapFactory.Options options;
                            options = new BitmapFactory.Options();
                            options.inSampleSize = 5;

                            ByteArrayOutputStream baos1 = new ByteArrayOutputStream();

                            if (photo != null) {
                                photo.compress(Bitmap.CompressFormat.JPEG, 10, baos1);
                                byte[] b1 = baos1.toByteArray();

                                String bitmapstring1 = Base64.encodeToString(b1,
                                        Base64.NO_WRAP);

                                Log.d("full_string", bitmapstring1);
                                String imageBase64 = bitmapstring1;
                                ComplaintDetailsActivity obj = new ComplaintDetailsActivity();
                                obj.imageVal(bitmapstring1);

                                f = new File(Environment.getExternalStorageDirectory().toString());
                                for (File temp : f.listFiles()) {
                                    if (temp.getName().equals("temp.jpg")) {
                                        f = temp;
                                        break;
                                    }
                                }
                                imageuri = f.getAbsolutePath();

                                questionResponse.getD().get(adapterPosition).setImage(encodedImage);
                                adapterQuestionMaster.notifyDataSetChanged();
                            }
                        }
                        catch (Exception e)
                        {
                            //handle exception
                        }
                        Log.i(TAG,"Selected File Path:" + selectedFilePath);

                        if(selectedFilePath != null && !selectedFilePath.equals("")){
    //                        tvFileName.setText(selectedFilePath);
                        }else{
                            Toast.makeText(this,"Cannot upload file to server",Toast.LENGTH_SHORT).show();
                        }

                        //on upload button Click
                        if(selectedFilePath != null){
    //                        dialog = ProgressDialog.show(ComplaintDetailsActivity.this,"","Uploading File...",true);

                            new Thread(new Runnable() {
                                @Override
                                public void run() {
                                    //creating new thread to handle Http Operations
    //                                uploadFile(selectedFilePath);
                                    uploadFiles(selectedFilePath, selectedFileUri);
                                }
                            }).start();
                        }else{
                            Toast.makeText(ComplaintDetailsActivity.this,"Please choose a File First",Toast.LENGTH_SHORT).show();
                        }
                    }
                }
            }

        }

мой путь к файлу:

public class FilePath {

    /**
     * Method for return file path of Gallery image/ Document / Video / Audio
     *
     * @param context
     * @param uri
     * @return path of the selected image file from gallery
     */
    //@RequiresApi(api = Build.VERSION_CODES.KITKAT)
    public static String getPath(final Context context, final Uri uri) {

        // check here to KITKAT or new version
        final boolean isKitKat = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT;

        // DocumentProvider
        if (isKitKat && DocumentsContract.isDocumentUri(context, uri)) {

            // ExternalStorageProvider
            if (isExternalStorageDocument(uri)) {
                final String docId = DocumentsContract.getDocumentId(uri);
                final String[] split = docId.split(":");
                final String type = split[0];

                if ("primary".equalsIgnoreCase(type)) {
                    return Environment.getExternalStorageDirectory() + "/"
                            + split[1];
                }
            }
            // DownloadsProvider
            else if (isDownloadsDocument(uri)) {

                final String id = DocumentsContract.getDocumentId(uri);
                final Uri contentUri = ContentUris.withAppendedId(
                        Uri.parse("content://downloads/public_downloads"),
                        Long.valueOf(id));

                return getDataColumn(context, contentUri, null, null);
            }
            // MediaProvider
            else if (isMediaDocument(uri)) {
                final String docId = DocumentsContract.getDocumentId(uri);
                final String[] split = docId.split(":");
                final String type = split[0];

                Uri contentUri = null;
                if ("image".equals(type)) {
                    contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
                } else if ("video".equals(type)) {
                    contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
                } else if ("audio".equals(type)) {
                    contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
                }

                final String selection = "_id=?";
                final String[] selectionArgs = new String[] { split[1] };

                return getDataColumn(context, contentUri, selection,
                        selectionArgs);
            }
        }
        // MediaStore (and general)
        else if ("content".equalsIgnoreCase(uri.getScheme())) {

            // Return the remote address
            if (isGooglePhotosUri(uri))
                return uri.getLastPathSegment();

            return getDataColumn(context, uri, null, null);
        }
        // File
        else if ("file".equalsIgnoreCase(uri.getScheme())) {
            return uri.getPath();
        }

        return null;
    }

    /**
     * Get the value of the data column for this Uri. This is useful for
     * MediaStore Uris, and other file-based ContentProviders.
     *
     * @param context
     *            The context.
     * @param uri
     *            The Uri to query.
     * @param selection
     *            (Optional) Filter used in the query.
     * @param selectionArgs
     *            (Optional) Selection arguments used in the query.
     * @return The value of the _data column, which is typically a file path.
     */
    public static String getDataColumn(Context context, Uri uri,
                                       String selection, String[] selectionArgs) {

        Cursor cursor = null;
        final String column = "_data";
        final String[] projection = { column };

        try {
            cursor = context.getContentResolver().query(uri, projection,
                    selection, selectionArgs, null);
            if (cursor != null && cursor.moveToFirst()) {
                final int index = cursor.getColumnIndexOrThrow(column);
                return cursor.getString(index);
            }
        } finally {
            if (cursor != null)
                cursor.close();
        }
        return null;
    }

    /**
     * @param uri
     *            The Uri to check.
     * @return Whether the Uri authority is ExternalStorageProvider.
     */
    public static boolean isExternalStorageDocument(Uri uri) {
        return "com.android.externalstorage.documents".equals(uri
                .getAuthority());
    }

    /**
     * @param uri
     *            The Uri to check.
     * @return Whether the Uri authority is DownloadsProvider.
     */
    public static boolean isDownloadsDocument(Uri uri) {
        return "com.android.providers.downloads.documents".equals(uri
                .getAuthority());
    }

    /**
     * @param uri
     *            The Uri to check.
     * @return Whether the Uri authority is MediaProvider.
     */
    public static boolean isMediaDocument(Uri uri) {
        return "com.android.providers.media.documents".equals(uri
                .getAuthority());
    }

    /**
     * @param uri
     *            The Uri to check.
     * @return Whether the Uri authority is Google Photos.
     */
    public static boolean isGooglePhotosUri(Uri uri) {
        return "com.google.android.apps.photos.content".equals(uri
                .getAuthority());
    }
}

класс загрузки файла:

    private void uploadFiles(final String selectedFilePath,final Uri fileUri) {


        //creating a file
        File file = new File(selectedFilePath);

        //creating request body for file
        RequestBody requestFile = RequestBody.create(MediaType.parse(getContentResolver().getType(fileUri)), file);


        //The gson builder
        Gson gson = new GsonBuilder()
                .setLenient()
                .create();

        //creating our api

        userService = RetrofitClient.getApiServiceFile();

        //creating a call and calling the upload image method
        Call<ImageResponse> call = userService.uploadImage(requestFile);

        //finally performing the call
        call.enqueue(new Callback<ImageResponse>() {
            @Override
            public void onResponse(Call<ImageResponse> call, Response<ImageResponse> response) {

             //   dialog.dismiss();
                ImageResponse imageResponse = response.body();

//                questionResponse.getD().get(adapterPosition).setImage(imageResponse.getImageName());
                    Log.d("response32",imageResponse.getImageName());
                    ImageName =imageResponse.getImageName();
                ImageId = imageResponse.getImageID();
                questionResponse.getD().get(adapterPosition).setImageName(ImageName);
                questionResponse.getD().get(adapterPosition).setImageID(ImageId);
                adapterQuestionMaster.notifyDataSetChanged();
                    Toast.makeText(getApplicationContext(), "File Uploaded Successfully...", Toast.LENGTH_LONG).show();

            }

            @Override
            public void onFailure(Call<ImageResponse> call, Throwable t) {
//                dialog.dismiss();
            }
        });
    }

Это моя ошибка:

E / AndroidRuntime: ФАТАЛЬНОЕ ИСКЛЮЧЕНИЕ: main Процесс: com.example.ggs.tvscomplaintstudy, PID: 18656 java.lang.RuntimeException: ошибка доставки результата ResultInfo {кто = ноль, запрос = 1, результат = -1, данные = намерение { act = inline-data (имеет дополнения)}} к активности {Com.example.ggs.tvscomplaintstudy / com.example.ggs.tvscomplaintstudy.app.complaint_details.ComplaintDetailsActivity}: java.lang.NullPointerException: попытка вызвать виртуальный метод java.lang.String android.net.Uri.getScheme () для нулевого объекта ссылка на android.app.ActivityThread.deliverResults (ActivityThread.java:4932) на android.app.ActivityThread.handleSendResult (ActivityThread.java:4975) atroid.app.ActivityThread.-wrap20 (неизвестный источник: 0) на android.app.ActivityThread $ H.handleMessage (ActivityThread.java:1950) на android.os.Handler.dispatchMessage (Handler.java:108) на android.os.Looper.loop (Looper.java:166) на android.app.ActivityThread.main (ActivityThread.java:7425) в java.lang.reflect.Method.invoke (родной метод) на com.android.internal.os.Zygote $ MethodAndArgsCaller.run (Zygote.java:245) на com.android.internal.os.ZygoteInit.main (ZygoteInit.java:921) Вызывается: java.lang.NullPointerException: Попытка вызвать виртуальный метод 'java.lang.String android.net.Uri.getScheme ()' на ссылка на нулевой объект в com.example.ggs.tvscomplaintstudy.app.complaint_details.FilePath.getPath (FilePath.java:79) в com.example.ggs.tvscomplaintstudy.app.complaint_details.ComplaintDetailsActivity.onActivityResult (ComplaintDetailsActivity.java:1118) на android.app.Activity.dispatchActivityResult (Activity.java:7690) на android.app.ActivityThread.deliverResults (ActivityThread.java:4928) на android.app.ActivityThread.handleSendResult (ActivityThread.java:4975) atroid.app.ActivityThread.-wrap20 (неизвестный источник: 0) на android.app.ActivityThread $ H.handleMessage (ActivityThread.java:1950) на android.os.Handler.dispatchMessage (Handler.java:108) на android.os.Looper.loop (Looper.java:166) на android.app.ActivityThread.main (ActivityThread.java:7425) в java.lang.reflect.Method.invoke (родной метод) на com.android.internal.os.Zygote $ MethodAndArgsCaller.run (Zygote.java:245) на com.android.internal.os.ZygoteInit.main (ZygoteInit.java:921)

...