Skip to content

Query MediaStore for media file URI for setting ringtone #4389

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Draft
wants to merge 1 commit into
base: release/4.0
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -114,7 +114,7 @@ protected final AsyncTaskResult<Boolean> doInBackground(

// delete file from media database
if (!file.isSmb() && !file.isSftp())
MediaConnectionUtils.scanFile(
MediaConnectionUtils.scanFiles(
applicationContext, files.toArray(new HybridFile[files.size()]));

// delete file entry from encrypted database
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -106,8 +106,8 @@ class MoveFilesTask(
for (hybridFileParcelables in files) {
sourcesFiles.addAll(hybridFileParcelables)
}
MediaConnectionUtils.scanFile(applicationContext, sourcesFiles.toTypedArray())
MediaConnectionUtils.scanFile(applicationContext, targetFiles.toTypedArray())
MediaConnectionUtils.scanFiles(applicationContext, sourcesFiles.toTypedArray())
MediaConnectionUtils.scanFiles(applicationContext, targetFiles.toTypedArray())
}

// updating encrypted db entry if any encrypted file was moved
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -468,7 +468,7 @@ void copyRoot(HybridFileParcelable sourceFile, HybridFile targetFile, boolean mo
e);
failedFOps.add(sourceFile);
}
MediaConnectionUtils.scanFile(c, new HybridFile[] {targetFile});
MediaConnectionUtils.scanFiles(c, new HybridFile[] {targetFile});
}

private void copyFiles(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1581,7 +1581,7 @@ public void restoreFromBin(Context context) {
if (!source.renameTo(dest)) {
return false;
}
MediaConnectionUtils.scanFile(context, new HybridFile[] {this});
MediaConnectionUtils.scanFiles(context, new HybridFile[] {this});
return true;
});
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@
import android.provider.MediaStore;
import android.util.Log;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;

/**
Expand Down Expand Up @@ -164,6 +165,41 @@ public static OutputStream getOutputStream(Context context, String str) {
}
}

public static Uri getUriForMusicMediaFrom(@NonNull String path, @NonNull Context context) {
Uri retval = getUriForMusicMediaInternal(path, context);
return retval;
}

private static Uri getUriForMusicMediaInternal(@NonNull String path, @NonNull Context context) {
String[] projection = {MediaStore.Audio.Media._ID, MediaStore.Audio.Media.DATA};

String selection = MediaStore.Audio.Media.DATA + "=?";
String[] selectionArgs = new String[] {path};

try (Cursor cursor =
context
.getContentResolver()
.query(
MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,
projection,
selection,
selectionArgs,
null)) {
if (cursor != null && cursor.moveToFirst()) {
int id = cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media._ID));
return MediaStore.Audio.Media.EXTERNAL_CONTENT_URI
.buildUpon()
.appendPath(String.valueOf(id))
.build();
} else {
return null;
}
} catch (Exception e) {
Log.e(TAG, "Error querying MediaStore", e);
return null;
}
}

/** Returns an OutputStream to write to the file. The file will be truncated immediately. */
private static int getTemporaryAlbumId(final Context context) {
final File temporaryTrack;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -717,7 +717,7 @@ protected void onPostExecute(Void aVoid) {
super.onPostExecute(aVoid);
if (newFile != null && oldFile != null) {
HybridFile[] hybridFiles = {newFile, oldFile};
MediaConnectionUtils.scanFile(context, hybridFiles);
MediaConnectionUtils.scanFiles(context, hybridFiles);
}
}
}.executeOnExecutor(executor);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -269,7 +269,7 @@ private void startCopy(
// If target file is copied onto the device and copy was successful, trigger media store
// rescan
if (mTargetFile != null) {
MediaConnectionUtils.scanFile(mContext, new HybridFile[] {mTargetFile});
MediaConnectionUtils.scanFiles(mContext, new HybridFile[] {mTargetFile});
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,13 +36,14 @@ object MediaConnectionUtils {
* @param hybridFiles files to be scanned
*/
@JvmStatic
fun scanFile(
fun scanFiles(
context: Context,
hybridFiles: Array<HybridFile>,
) {
val paths = arrayOfNulls<String>(hybridFiles.size)

for (i in hybridFiles.indices) paths[i] = hybridFiles[i].path
val paths: Array<String> =
hybridFiles.map {
it.path
}.toTypedArray()

MediaScannerConnection.scanFile(
context,
Expand All @@ -52,4 +53,31 @@ object MediaConnectionUtils {
LOG.info("MediaConnectionUtils#scanFile finished scanning path$path")
}
}

/**
* Invokes MediaScannerConnection#scanFile for the given file.
*
* @param context the context
* @param path the file path to be scanned
* @param mimeType the mime type of the file. Optional.
*
*/
@JvmStatic
fun scanFileByFileSystemPathAndMimeType(
context: Context,
path: String,
mimeType: String? = null,
callback: MediaScannerConnection.OnScanCompletedListener? = null,
) {
MediaScannerConnection.scanFile(
context,
arrayOf(path),
mimeType?.let {
arrayOf(it)
},
) { scannedPath: String, uri: Uri? ->
LOG.info("Finished scanning path $scannedPath")
callback?.onScanCompleted(path, uri)
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ import com.amaze.filemanager.asynchronous.asynctasks.searchfilesystem.SearchResu
import com.amaze.filemanager.asynchronous.asynctasks.searchfilesystem.searchParametersFromBoolean
import com.amaze.filemanager.fileoperations.filesystem.OpenMode
import com.amaze.filemanager.filesystem.HybridFile
import com.amaze.filemanager.filesystem.files.MediaConnectionUtils.scanFile
import com.amaze.filemanager.filesystem.files.MediaConnectionUtils.scanFiles
import com.amaze.filemanager.ui.fragments.preferencefragments.PreferencesConstants.PREFERENCE_REGEX
import com.amaze.filemanager.ui.fragments.preferencefragments.PreferencesConstants.PREFERENCE_REGEX_MATCHES
import com.amaze.filemanager.ui.fragments.preferencefragments.PreferencesConstants.PREFERENCE_SHOW_HIDDENFILES
Expand Down Expand Up @@ -235,7 +235,7 @@ class MainActivityViewModel(val applicationContext: Application) :
OpenMode.TRASH_BIN,
originalFilePath,
)
scanFile(applicationContext, arrayOf(hybridFile))
scanFiles(applicationContext, arrayOf(hybridFile))
val intent = Intent(MainActivity.KEY_INTENT_LOAD_LIST)
hybridFile.getParent(applicationContext)?.let {
intent.putExtra(MainActivity.KEY_INTENT_LOAD_LIST_FILE, it)
Expand Down Expand Up @@ -291,7 +291,7 @@ class MainActivityViewModel(val applicationContext: Application) :
OpenMode.TRASH_BIN,
source,
)
scanFile(applicationContext, arrayOf(hybridFile))
scanFiles(applicationContext, arrayOf(hybridFile))
val intent = Intent(MainActivity.KEY_INTENT_LOAD_LIST)
hybridFile.getParent(applicationContext)?.let {
intent.putExtra(MainActivity.KEY_INTENT_LOAD_LIST_FILE, it)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,7 @@
import com.amaze.filemanager.filesystem.FileProperties;
import com.amaze.filemanager.filesystem.HybridFile;
import com.amaze.filemanager.filesystem.HybridFileParcelable;
import com.amaze.filemanager.filesystem.MediaStoreHack;
import com.amaze.filemanager.filesystem.SafRootHolder;
import com.amaze.filemanager.filesystem.files.CryptUtil;
import com.amaze.filemanager.filesystem.files.EncryptDecryptUtils;
Expand Down Expand Up @@ -136,6 +137,7 @@
import jcifs.smb.SmbFile;
import kotlin.collections.ArraysKt;
import kotlin.collections.CollectionsKt;
import kotlin.text.StringsKt;

public class MainFragment extends Fragment
implements BottomBarButtonPath,
Expand Down Expand Up @@ -574,10 +576,26 @@ public void returnIntentResults(HybridFileParcelable[] baseFiles) {
HybridFileParcelable resultBaseFile = result.getKey();

if (requireMainActivity().mRingtonePickerIntent) {
intent.setDataAndType(
resultUri,
MimeTypes.getMimeType(resultBaseFile.getPath(), resultBaseFile.isDirectory()));
intent.putExtra(RingtoneManager.EXTRA_RINGTONE_PICKED_URI, resultUri);
// Query MediaStore to get the proper content URI for the selected audio file
Uri mediaFileUri =
MediaStoreHack.getUriForMusicMediaFrom(resultBaseFile.getPath(), requireContext());
if (mediaFileUri != null) {
String filename = resultBaseFile.getName();
Uri properUri =
mediaFileUri
.buildUpon()
.appendQueryParameter("canonical", "1")
.appendQueryParameter("title", StringsKt.substringBeforeLast(filename, ".", ""))
.build();
// Set the proper content URI as result
intent.setDataAndType(properUri, "audio/*");
intent.putExtra(RingtoneManager.EXTRA_RINGTONE_PICKED_URI, properUri);
} else {
Toast.makeText(requireContext(), R.string.error_mediastore_query_uri, Toast.LENGTH_LONG)
.show();
requireMainActivity().finish();
return;
}
} else {
LOG.debug("pickup file");
intent.setDataAndType(resultUri, MimeTypes.getExtension(resultBaseFile.getPath()));
Expand Down Expand Up @@ -1353,7 +1371,7 @@ public void hide(String path) {
LOG.warn("failure when hiding file", e);
}
}
MediaConnectionUtils.scanFile(
MediaConnectionUtils.scanFiles(
requireMainActivity(), new HybridFile[] {new HybridFile(OpenMode.FILE, path)});
}
}
Expand Down
1 change: 1 addition & 0 deletions app/src/main/res/values/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -848,5 +848,6 @@ You only need to do this once, until the next time you select a new location for
<string name="trash_bin_retention_bytes_summary">Maximum data (in MBs) trash bin can store</string>
<string name="trash_bin_cleanup_interval_title">Cleanup interval</string>
<string name="trash_bin_cleanup_interval_summary">Trigger auto-cleanup interval (hours)</string>
<string name="error.mediastore.query.uri">Error querying MediaStore for content URI of select media file. Refresh the MediaStore and try again.</string>
</resources>

Loading