Я хочу загрузить файл PDF на сервер через несколько частей - PullRequest
0 голосов
/ 27 ноября 2018

Я хочу загрузить PDF-файл на сервер через многочастную I-студию Android, недавно столкнувшуюся с проблемой: код иногда работает нормально и PDF успешно отправляется на сервер, но большую часть времени дает значение пути null

String path = FilePath.getPath (this, filePath);

Основной класс активности

public class cv extends AppCompatActivity implements View.OnClickListener 
  {

//Declaring views
private Button buttonChoose;
private Button buttonUpload;
User user = SharedPrefManager.getInstance(this).getUser();

private EditText editText;
private PermissionObj permissionObj;



ImageView imageView;

//Image request code
private int PICK_PDF_REQUEST = 120;

//storage permission code
private static final int STORAGE_PERMISSION_CODE = 123;

//Bitmap to get image from gallery
private Bitmap bitmap;

//Uri to store the image uri
private Uri filePath;

//ListView to show the fetched Pdfs from the server


//button to fetch the intiate the fetching of pdfs.
Button buttonFetch;

//Progress bar to check the progress of obtaining pdfs
ProgressDialog progressDialog;

//an array to hold the different pdf objects
ArrayList<Pdf> pdfList = new ArrayList<Pdf>();

//pdf adapter



@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_cv);
    requestStoragePermission();
    //Requesting storage permission
    permissionObj = new PermissionObj(this);
    //Initializing views
    buttonChoose = (Button) findViewById(R.id.buttonChoose);
    buttonUpload = (Button) findViewById(R.id.buttonUpload);

    editText = (EditText) findViewById(R.id.editTextName);


    //initializing buttonFetch
    buttonFetch = (Button) findViewById(R.id.buttonFetchPdf);

    //initializing progressDialog

    progressDialog = new ProgressDialog(this);

    //Setting clicklistener
    buttonChoose.setOnClickListener(this);
    buttonUpload.setOnClickListener(this);
    buttonFetch.setOnClickListener(this);



}



/*
 * This is the method responsible for image upload
 * We need the full image path and the name for the image in this method
 * */


public void uploadMultipart() {
    //getting name for the pdf
    String name = editText.getText().toString().trim();
    //getting the actual path of the pdf
    String path = FilePath.getPath(this,filePath);
    Log.d("path", "Path:  "+path);
    if (path == null) {

        Toast.makeText(this, "Please move your .pdf file to internal storage and retry", Toast.LENGTH_LONG).show();
    } else {
        //Uploading code
        try {
            String uploadId = UUID.randomUUID().toString();

            //Creating a multi part request
            new MultipartUploadRequest(this, uploadId, URLs.user_add_resume)
                    .addFileToUpload(path, "resume") //Adding file
                    .addParameter("user_id", String.valueOf(user.getId())) //Adding text parameter to the request
                    .addParameter("token", user.getapi_token()) //Adding text parameter to the request
                    .setNotificationConfig(new UploadNotificationConfig())
                    .setMaxRetries(2)
                    .startUpload(); //Starting the upload

        } catch (Exception exc) {
            Toast.makeText(this, exc.getMessage(), Toast.LENGTH_SHORT).show();
        }
    }
}

/* Get uri related content real local file path. */

//method to show file chooser
private void showFileChooser() {
    Intent intent = new Intent();
    intent.setType("application/pdf");
    intent.setAction(Intent.ACTION_GET_CONTENT);
    startActivityForResult(Intent.createChooser(intent, "Select Pdf"), PICK_PDF_REQUEST);
}

//handling the ima chooser activity result

//handling the ima chooser activity result
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

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

    }
}


//Requesting permission
private void requestStoragePermission() {
    if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED)
        return;

    if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.READ_EXTERNAL_STORAGE)) {
        //If the user has denied the permission previously your code will come to this block
        //Here you can explain why you need this permission
        //Explain here why you need this permission
    }
    //And finally ask for the permission
    ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, STORAGE_PERMISSION_CODE);
}


//This method will be called when the user will tap on allow or deny
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {

    //Checking the request code of our request
    if (requestCode == STORAGE_PERMISSION_CODE) {

        //If permission is granted
        if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            //Displaying a toast
            Toast.makeText(this, "Permission granted now you can read the storage", Toast.LENGTH_LONG).show();
        } else {
            //Displaying another toast if permission is not granted
            Toast.makeText(this, "Oops you just denied the permission", Toast.LENGTH_LONG).show();
        }
    }
}


@Override
public void onClick(View v) {
    if (v == buttonChoose) {
        requestStoragePermission();

                showFileChooser();





    }
    if (v == buttonUpload) {

            uploadMultipart();


    }

    if (v == buttonFetch) {


    }
}

} Класс пути к файлу

     import android.annotation.SuppressLint; 
     import android.content.ContentUris;
     import android.content.Context;
     import android.database.Cursor;
     import android.net.Uri;
     import android.os.Build;
     import android.os.Environment;
     import android.provider.DocumentsContract;
      import android.provider.MediaStore;
     import android.util.Log;

     public class FilePath
     {


/**
 * Method for return file path of Gallery image
 *
 * @param context
 * @param uri
 * @return path of the selected image file from gallery
 */
@SuppressLint("NewApi")

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)) {
                Log.d("envirment", "Path:  "+Environment.getExternalStorageDirectory().getAbsolutePath() + "/" + split[1]);
                return Environment.getExternalStorageDirectory().getAbsolutePath() + "/" + 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())) {
        Log.d("url.get", "Path:  "+uri.getPath());
        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());
}

}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...