Get Path from another app (WhatsApp)

后端 未结 7 1183
萌比男神i
萌比男神i 2020-12-13 22:49

I\'m not getting Path from image or video from uri that I receive from whatsApp.

Uri comes like this: content://com.whatsapp.provider.media/item/16695

Media

相关标签:
7条回答
  • 2020-12-13 23:16

    You can try this it will help for you.You can't get path from WhatsApp directly.If you need an file path first copy file and send new file path. Using the code below

     public static String getFilePathFromURI(Context context, Uri contentUri) {
        String fileName = getFileName(contentUri);
        if (!TextUtils.isEmpty(fileName)) {
            File copyFile = new File(TEMP_DIR_PATH  + fileName+".jpg");
            copy(context, contentUri, copyFile);
            return copyFile.getAbsolutePath();
        }
        return null;
    }
    
    public static String getFileName(Uri uri) {
        if (uri == null) return null;
        String fileName = null;
        String path = uri.getPath();
        int cut = path.lastIndexOf('/');
        if (cut != -1) {
            fileName = path.substring(cut + 1);
        }
        return fileName;
    }
    
    public static void copy(Context context, Uri srcUri, File dstFile) {
        try {
            InputStream inputStream = context.getContentResolver().openInputStream(srcUri);
            if (inputStream == null) return;
            OutputStream outputStream = new FileOutputStream(dstFile);
            IOUtils.copy(inputStream, outputStream);
            inputStream.close();
            outputStream.close();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    

    Then IOUtils class is like below

    public class IOUtils {
    
    
    
    private static final int BUFFER_SIZE = 1024 * 2;
    
    private IOUtils() {
        // Utility class.
    }
    
    public static int copy(InputStream input, OutputStream output) throws Exception, IOException {
        byte[] buffer = new byte[BUFFER_SIZE];
    
        BufferedInputStream in = new BufferedInputStream(input, BUFFER_SIZE);
        BufferedOutputStream out = new BufferedOutputStream(output, BUFFER_SIZE);
        int count = 0, n = 0;
        try {
            while ((n = in.read(buffer, 0, BUFFER_SIZE)) != -1) {
                out.write(buffer, 0, n);
                count += n;
            }
            out.flush();
        } finally {
            try {
                out.close();
            } catch (IOException e) {
                Log.e(e.getMessage(), e.toString());
            }
            try {
                in.close();
            } catch (IOException e) {
                Log.e(e.getMessage(), e.toString());
            }
        }
        return count;
    }
    
    
    }
    
    0 讨论(0)
  • 2020-12-13 23:17

    protected void onCreate(Bundle savedInstanceState) { /* * Your OnCreate */ Intent intent = getIntent(); String action = intent.getAction(); String type = intent.getType();

    //VIEW"
    if (Intent.ACTION_VIEW.equals(action) && type != null) {viewhekper(intent);//Handle text being sent}
    
    0 讨论(0)
  • 2020-12-13 23:22

    you can try to this , then you get a bitmap of selected image and then you can easily find it's native path from Device Default Gallery.

    Bitmap roughBitmap= null;
        try {
        // Works with content://, file://, or android.resource:// URIs
        InputStream inputStream =
        getContentResolver().openInputStream(uri);
        roughBitmap= BitmapFactory.decodeStream(inputStream);
    
        // calc exact destination size
        Matrix m = new Matrix();
        RectF inRect = new RectF(0, 0, roughBitmap.Width, roughBitmap.Height);
        RectF outRect = new RectF(0, 0, dstWidth, dstHeight);
        m.SetRectToRect(inRect, outRect, Matrix.ScaleToFit.Center);
        float[] values = new float[9];
        m.GetValues(values);
    
    
        // resize bitmap if needed
        Bitmap resizedBitmap = Bitmap.CreateScaledBitmap(roughBitmap, (int) (roughBitmap.Width * values[0]), (int) (roughBitmap.Height * values[4]), true);
    
        string name = "IMG_" + new Java.Text.SimpleDateFormat("yyyyMMdd_HHmmss").Format(new Java.Util.Date()) + ".png";
        var sdCardPath= Environment.GetExternalStoragePublicDirectory("DCIM").AbsolutePath;
        Java.IO.File file = new Java.IO.File(sdCardPath);
        if (!file.Exists())
        {
            file.Mkdir();
        }
        var filePath = System.IO.Path.Combine(sdCardPath, name);
        } catch (FileNotFoundException e) {
        // Inform the user that things have gone horribly wrong
        }
    
    0 讨论(0)
  • 2020-12-13 23:29

    Using the code example below will return to you the bitmap :

    BitmapFactory.decodeStream(getContentResolver().openInputStream(Uri.parse("content://com.whatsapp.provider.media/item/128752")))
    

    After that you all know what you have to do.

    0 讨论(0)
  • 2020-12-13 23:35

    It works for me for opening small text file... I didn't try in other file

    protected void viewhelper(Intent intent) {
        Uri a = intent.getData();
        if (!a.toString().startsWith("content:")) {
            return;
        }
        //Ok Let's do it
        String content = readUri(a);
        //do something with this content
    }
    

    here is the readUri(Uri uri) method

    private String readUri(Uri uri) {
        InputStream inputStream = null;
        try {
            inputStream = getContentResolver().openInputStream(uri);
            if (inputStream != null) {
                byte[] buffer = new byte[1024];
                int result;
                String content = "";
                while ((result = inputStream.read(buffer)) != -1) {
                    content = content.concat(new String(buffer, 0, result));
                }
                return content;
            }
        } catch (IOException e) {
            Log.e("receiver", "IOException when reading uri", e);
        } finally {
            if (inputStream != null) {
                try {
                    inputStream.close();
                } catch (IOException e) {
                    Log.e("receiver", "IOException when closing stream", e);
                }
            }
        }
        return null;
    }
    

    I got it from this repository https://github.com/zhutq/android-file-provider-demo/blob/master/FileReceiver/app/src/main/java/com/demo/filereceiver/MainActivity.java
    I modified some code so that it work.

    Manifest file:

        <activity android:name=".MainActivity">
            <intent-filter >
                <action android:name="android.intent.action.VIEW" />
                <category android:name="android.intent.category.DEFAULT" />
                <data android:mimeType="*/*" />
            </intent-filter>
        </activity>
    

    You need to add

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        /*
         *    Your OnCreate
         */
        Intent intent = getIntent();
        String action = intent.getAction();
        String type = intent.getType();
    
        //VIEW"
        if (Intent.ACTION_VIEW.equals(action) && type != null) {
            viewhelper(intent); // Handle text being sent
        }
      }
    
    0 讨论(0)
  • 2020-12-13 23:39

    You can also convert the URI to file and then to bytes if you want to upload the photo to your server.

    Check out : https://www.stackoverflow.com/a/49575321

    0 讨论(0)
提交回复
热议问题