1+ package com .dhims .androidutils ;
2+
3+ import android .annotation .SuppressLint ;
4+ import android .content .ContentUris ;
5+ import android .content .Context ;
6+ import android .database .Cursor ;
7+ import android .net .Uri ;
8+ import android .os .Build ;
9+ import android .os .Environment ;
10+ import android .provider .DocumentsContract ;
11+ import android .provider .MediaStore ;
12+ import android .support .v4 .content .ContextCompat ;
13+
14+ import java .io .File ;
15+ import java .io .IOException ;
16+ import java .net .URISyntaxException ;
17+ import java .util .ArrayList ;
18+ import java .util .Collections ;
19+ import java .util .List ;
20+
21+ /**
22+ * Utility functions for handling path.
23+ *
24+ * @author Dhimant Desai ([email protected] ) 25+ */
26+ public class PathUtil {
27+ /*
28+ * Gets the file path of the given Uri.
29+ */
30+ @ SuppressLint ("NewApi" )
31+ public static String getPath (Context context , Uri uri ) throws URISyntaxException {
32+ final boolean needToCheckUri = Build .VERSION .SDK_INT >= 19 ;
33+ String selection = null ;
34+ String [] selectionArgs = null ;
35+ // Uri is different in versions after KITKAT (Android 4.4), we need to
36+ // deal with different Uris.
37+ if (needToCheckUri && DocumentsContract .isDocumentUri (context .getApplicationContext (), uri )) {
38+ if (isExternalStorageDocument (uri )) {
39+ final String docId = DocumentsContract .getDocumentId (uri );
40+ final String [] split = docId .split (":" );
41+ final String type = split [0 ];
42+ if ("primary" .equalsIgnoreCase (type )) {
43+ return Environment .getExternalStorageDirectory () + "/" + split [1 ];
44+ } else {
45+ File [] files = ContextCompat .getExternalFilesDirs (context , null );
46+ for (File file : files ) {
47+ if (file .getAbsolutePath ().contains (type )) {
48+ return file .getParentFile ().getParentFile ().getParentFile ().getParentFile () + "/" + split [1 ];
49+ }
50+ }
51+ }
52+ } else if (isDownloadsDocument (uri )) {
53+ final String id = DocumentsContract .getDocumentId (uri );
54+ uri = ContentUris .withAppendedId (
55+ Uri .parse ("content://downloads/public_downloads" ), Long .valueOf (id ));
56+ } else if (isMediaDocument (uri )) {
57+ final String docId = DocumentsContract .getDocumentId (uri );
58+ final String [] split = docId .split (":" );
59+ final String type = split [0 ];
60+ if ("image" .equals (type )) {
61+ uri = MediaStore .Images .Media .EXTERNAL_CONTENT_URI ;
62+ } else if ("video" .equals (type )) {
63+ uri = MediaStore .Video .Media .EXTERNAL_CONTENT_URI ;
64+ } else if ("audio" .equals (type )) {
65+ uri = MediaStore .Audio .Media .EXTERNAL_CONTENT_URI ;
66+ }
67+ selection = "_id=?" ;
68+ selectionArgs = new String []{split [1 ]};
69+ }
70+ }
71+ if ("content" .equalsIgnoreCase (uri .getScheme ())) {
72+ String [] projection = {MediaStore .Images .Media .DATA };
73+ Cursor cursor = null ;
74+ try {
75+ cursor = context .getContentResolver ().query (uri , projection , selection , selectionArgs , null );
76+ assert cursor != null ;
77+ int column_index = cursor .getColumnIndexOrThrow (MediaStore .Images .Media .DATA );
78+ if (cursor .moveToFirst ()) {
79+ return cursor .getString (column_index );
80+ }
81+ } catch (Exception e ) {
82+ }
83+ } else if ("file" .equalsIgnoreCase (uri .getScheme ())) {
84+ return uri .getPath ();
85+ }
86+ return null ;
87+ }
88+
89+ /**
90+ * @param uri The Uri to check.
91+ * @return Whether the Uri authority is ExternalStorageProvider.
92+ */
93+ private static boolean isExternalStorageDocument (Uri uri ) {
94+ return "com.android.externalstorage.documents" .equals (uri .getAuthority ());
95+ }
96+
97+ /**
98+ * @param uri The Uri to check.
99+ * @return Whether the Uri authority is DownloadsProvider.
100+ */
101+ private static boolean isDownloadsDocument (Uri uri ) {
102+ return "com.android.providers.downloads.documents" .equals (uri .getAuthority ());
103+ }
104+
105+ /**
106+ * @param uri The Uri to check.
107+ * @return Whether the Uri authority is MediaProvider.
108+ */
109+ private static boolean isMediaDocument (Uri uri ) {
110+ return "com.android.providers.media.documents" .equals (uri .getAuthority ());
111+ }
112+
113+ private static String getAppExternalDataDirectoryPath () {
114+ StringBuilder sb = new StringBuilder ();
115+ sb .append (Environment .getExternalStorageDirectory ())
116+ .append (File .separator )
117+ .append ("Android" )
118+ .append (File .separator )
119+ .append ("data" )
120+ .append (File .separator )
121+ .append ("Package" )
122+ .append (File .separator );
123+
124+ return sb .toString ();
125+ }
126+
127+ private static File getAppExternalDataDirectoryFile () {
128+ File dataDirectoryFile = new File (getAppExternalDataDirectoryPath ());
129+ dataDirectoryFile .mkdirs ();
130+
131+ return dataDirectoryFile ;
132+ }
133+
134+ public static File getTemporaryCameraFile () {
135+ File storageDir = new File (getAppExternalDataDirectoryFile (), "Camera" );
136+ storageDir .mkdirs ();
137+ File file = new File (storageDir , "CAMERA_" + System .currentTimeMillis () + ".jpg" );
138+ try {
139+ file .createNewFile ();
140+ } catch (IOException e ) {
141+ e .printStackTrace ();
142+ }
143+ return file ;
144+ }
145+
146+ /**
147+ * @return Last Capture Camera Image Path
148+ */
149+ public static File getLastUsedCameraFile () {
150+ File dataDir = new File (getAppExternalDataDirectoryFile (), "Camera" );
151+ File [] files = dataDir .listFiles ();
152+ List <File > filteredFiles = new ArrayList <>();
153+ for (File file : files ) {
154+ if (file .getName ().startsWith ("CAMERA_" )) {
155+ filteredFiles .add (file );
156+ }
157+ }
158+
159+ Collections .sort (filteredFiles );
160+ if (!filteredFiles .isEmpty ()) {
161+ return filteredFiles .get (filteredFiles .size () - 1 );
162+ } else {
163+ return null ;
164+ }
165+ }
166+ }
0 commit comments