Using MediaScanner to notify Android when a new file has been created on the system

This commit is contained in:
Sylvain Berfini 2018-10-18 16:22:57 +02:00
parent f5a6258766
commit 0f00eb157d
4 changed files with 83 additions and 1 deletions

View file

@ -111,6 +111,7 @@ import org.linphone.receivers.HookReceiver;
import org.linphone.receivers.KeepAliveReceiver;
import org.linphone.receivers.NetworkManager;
import org.linphone.receivers.OutgoingCallReceiver;
import org.linphone.ui.LinphoneMediaScanner;
import java.io.File;
import java.io.FileInputStream;
@ -210,6 +211,8 @@ public class LinphoneManager implements CoreListener, SensorEventListener, Accou
Log.e(mUserCertsPath+" can't be created.");
}
}
mMediaScanner = new LinphoneMediaScanner(c);
}
private static final int LINPHONE_VOLUME_STREAM = STREAM_VOICE_CALL;
@ -228,6 +231,7 @@ public class LinphoneManager implements CoreListener, SensorEventListener, Accou
private final String mUserCertsPath;
private Timer mTimer;
private Map<String, Integer> mUnreadChatsPerRoom;
private LinphoneMediaScanner mMediaScanner;
private void routeAudioToSpeakerHelper(boolean speakerOn) {
Log.w("Routing audio to " + (speakerOn ? "speaker" : "earpiece") + ", disabling bluetooth audio route");
@ -998,11 +1002,16 @@ public class LinphoneManager implements CoreListener, SensorEventListener, Accou
public static synchronized void destroy() {
if (instance == null) return;
instance.changeStatusToOffline();
instance.mMediaScanner.destroy();
sExited = true;
instance.destroyCore();
instance = null;
}
public LinphoneMediaScanner getMediaScanner() {
return mMediaScanner;
}
private String getString(int key) {
return mR.getString(key);
}

View file

@ -51,6 +51,8 @@ import org.linphone.core.AccountCreator;
import org.linphone.core.Address;
import org.linphone.core.Call;
import org.linphone.core.Call.State;
import org.linphone.core.ChatMessage;
import org.linphone.core.Content;
import org.linphone.core.Core;
import org.linphone.core.Factory;
import org.linphone.core.Friend;
@ -62,6 +64,7 @@ import org.linphone.core.LoggingServiceListener;
import org.linphone.core.ProxyConfig;
import org.linphone.mediastream.Log;
import org.linphone.mediastream.video.capture.hwconf.Hacks;
import org.linphone.ui.LinphoneMediaScanner;
import java.io.File;
import java.io.FileOutputStream;
@ -764,6 +767,7 @@ public final class LinphoneUtils {
if (!file.isDirectory() || !file.exists()) {
Log.w("Directory " + file + " doesn't seem to exists yet, let's create it");
file.mkdirs();
LinphoneManager.getInstance().getMediaScanner().scanFile(file);
}
return storageDir;
}
@ -776,5 +780,17 @@ public final class LinphoneUtils {
}
imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
}
public static void scanFile(ChatMessage message) {
String appData = message.getAppdata();
if (appData == null) {
for (Content c : message.getContents()) {
if (c.isFile()) {
appData = c.getFilePath();
}
}
}
LinphoneManager.getInstance().getMediaScanner().scanFile(new File(appData));
}
}

View file

@ -33,7 +33,6 @@ import android.media.ExifInterface;
import android.media.ThumbnailUtils;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Environment;
import android.provider.MediaStore;
import android.support.annotation.NonNull;
import android.support.v4.content.FileProvider;
@ -527,6 +526,7 @@ public class ChatEventsAdapter extends SelectableAdapter<ChatBubbleViewHolder> {
}
if (appData != null) {
LinphoneUtils.scanFile(message);
holder.fileName.setText(LinphoneUtils.getNameFromFilePath(appData));
if (LinphoneUtils.isExtensionImage(appData)) {
holder.messageImage.setVisibility(View.VISIBLE);

View file

@ -0,0 +1,57 @@
package org.linphone.ui;
import android.content.Context;
import android.media.MediaScannerConnection;
import android.net.Uri;
import org.linphone.mediastream.Log;
import java.io.File;
public class LinphoneMediaScanner implements MediaScannerConnection.MediaScannerConnectionClient {
private MediaScannerConnection mMediaConnection;
private boolean mIsConnected;
private File mFileWaitingForScan;
public LinphoneMediaScanner(Context context) {
mIsConnected = false;
mMediaConnection = new MediaScannerConnection(context, this);
mMediaConnection.connect();
mFileWaitingForScan = null;
}
@Override
public void onMediaScannerConnected() {
mIsConnected = true;
Log.i("[MediaScanner] Connected");
if (mFileWaitingForScan != null) {
scanFile(mFileWaitingForScan);
mFileWaitingForScan = null;
}
}
public void scanFile(File file) {
scanFile(file, null);
}
public void scanFile(File file, String mime) {
if (!mIsConnected) {
Log.w("[MediaScanner] Not connected yet...");
mFileWaitingForScan = file;
return;
}
Log.i("[MediaScanner] Scanning file " + file.getAbsolutePath() + " with MIME " + mime);
mMediaConnection.scanFile(file.getAbsolutePath(), mime);
}
@Override
public void onScanCompleted(String path, Uri uri) {
Log.i("[MediaScanner] Scan completed : " + path + " => " + uri);
}
public void destroy() {
Log.i("[MediaScanner] Disconnecting");
mMediaConnection.disconnect();
mIsConnected = false;
}
}