-4

I am trying to upload a PDF file to server but am getting a Null toast according to my method , i tested the file path in a TextView is visible but when it comes to uplaoding it seems not seeing the PDF file , am using ion library. Below is my code sample.

 public void uploadFile(final String selectedFilePath){




        final  ProgressDialog pd;
        pd = new ProgressDialog(MainActivity.this);
        pd.setMessage("Uploading ...");
        pd.setCancelable(false);
        pd.show();
        //File file = new File(this.getFilesDir().getAbsolutePath() + "/thesubdirectory/the.zip");
        File f = new File(getApplicationContext().getFilesDir().getAbsolutePath()+selectedFilePath);


        try {
            RandomAccessFile rf = new RandomAccessFile(f, "rw");
            rf.setLength(1024 * 1024 * 2);
        } catch (Exception e) {
            System.err.println(e);
        }
        File echoedFile = getFileStreamPath("echo");
            Ion.with(MainActivity.this)
                    .load(SERVER_URL)
                    .uploadProgressDialog(pd)
                    .setMultipartFile("uploaded_file",f)
                    .write(echoedFile)
                    .setCallback(new FutureCallback<File>() {
                        @Override
                        public void onCompleted(Exception e, File result) {


                            try {

                                Toast.makeText(MainActivity.this, " " + result, Toast.LENGTH_LONG).show();

                                System.out.println("Error  " + result);

                                pd.dismiss();

                            } catch (Exception e1) {
                                System.out.println("Error  " + e1);
                            }
                            pd.dismiss();


                        }
                    });



    }

This is the rest of code.

public class MainActivity extends AppCompatActivity {
    private static final int PICK_FILE_REQUEST = 1;
    private static final String TAG = MainActivity.class.getSimpleName();
    private String selectedFilePath;
    private String SERVER_URL = "http://192.168.43.104:8093/PoliceApp/FileUpload.aspx";
    ImageView ivAttachment;


    private ImageView imageView;
    private EditText firstname_edt,lastname_edt,email_edt,jobtitle_edt,source_edt;
    private TextView directory_txt,count_txt,upload_txt;
    private Button button;
    Future<File> uploading;
    ProgressDialog pd;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // Enable global Ion logging
        Ion.getDefault(this).configure().setLogging("ion-sample", Log.DEBUG);
        setContentView(R.layout.activity_main);



        imageView= (ImageView)findViewById(R.id.imageView);
        firstname_edt=(EditText)findViewById(R.id.firstname_edt);
        lastname_edt=(EditText)findViewById(R.id.lastname_edt);
        email_edt=(EditText)findViewById(R.id.email_edt);
        jobtitle_edt=(EditText)findViewById(R.id.jobtitle_edt);
        source_edt=(EditText)findViewById(R.id.source_edt);
        button=(Button)findViewById(R.id.button);
        directory_txt=(TextView)findViewById(R.id.directory_txt);
        count_txt=(TextView)findViewById(R.id.count_txt);
        upload_txt=(TextView)findViewById(R.id.upload_txt);

        imageView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                showFileChooser();
            }
        });

        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if(selectedFilePath != null){
                   // pd = ProgressDialog.show(MainActivity.this,"","Uploading File...",true);
                    uploadFile(selectedFilePath);
                    //  OnSendFileInfo();
                }else{
                    Toast.makeText(MainActivity.this,"Please choose a File First",Toast.LENGTH_SHORT).show();
                }
            }
        });





    }


    // Gallery pick

    private void showFileChooser() {
        Intent intent = new Intent();
        //sets the select file to all types of files
        intent.setType("*/*");
        //allows to select data and return it
        intent.setAction(Intent.ACTION_GET_CONTENT);
        //starts new activity to select file and return data
        startActivityForResult(Intent.createChooser(intent,"Choose File to Upload.."),PICK_FILE_REQUEST);
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if(resultCode == Activity.RESULT_OK){
            if(requestCode == PICK_FILE_REQUEST){
                if(data == null){
                    //no data present
                    return;
                }


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

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

This is the filepath class which returns file path of Gallery image/ Document / Video / Audio

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
     */

    @TargetApi(19)
    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());
    }
}
Lutaaya Huzaifah Idris
  • 3,596
  • 8
  • 38
  • 77

1 Answers1

0

This is the filepath class which returns file path of Gallery image/ Document / Video / Audio

That class is a piece of junk. It will not work for many Uri values on any Android device, let alone those devices where the "rules" encoded in that class have changed, due to manufacturer alterations or OS updates.

Moreover, none of those locations are inside of getFilesDir().

Use the Uri properly: use a ContentResolver and openInputStream() to get an InputStream on the content identified by the Uri. Either pass that InputStream to Ion (if it supports uploading from a stream), or use the stream to make a local copy of the content (e.g., into getCacheDir()), then upload the local copy.

CommonsWare
  • 986,068
  • 189
  • 2,389
  • 2,491
  • Can you show me like an example , because i got the class somewhere , and isee it shows all possible files which is an advantage , but let me ask you is my ion structure correct – Lutaaya Huzaifah Idris May 03 '17 at 13:59
  • @LutaayaHuzaifahIdris: "isee it shows all possible files which is an advantage" -- no, it does not. *Any app* can have a `ContentProvider` supporting a `content` `Uri`. The class handles four apps out of millions, and it does not even do those four correctly. Furthermore, you may not have direct filesystem access to the paths that this class returns, even when it is able to return one. – CommonsWare May 03 '17 at 14:09
  • what am i supposed to do in such a matter , am stuck – Lutaaya Huzaifah Idris May 03 '17 at 18:06
  • @LutaayaHuzaifahIdris: You follow the instructions in the last paragraph of my answer. Or, you stop using `ACTION_GET_CONTENT`, and instead integrate [a file chooser library](https://android-arsenal.com/tag/35?sort=created), so that you limit yourself to files that you can directly access on the filesystem. – CommonsWare May 03 '17 at 18:08
  • Ok thanks so much , but please if you can show me an example code like even giving me a Library to accomplish what am doing .Thanks – Lutaaya Huzaifah Idris May 03 '17 at 18:18