kopia lustrzana https://github.com/ryukoposting/Signal-Android
52 wiersze
1.6 KiB
Java
52 wiersze
1.6 KiB
Java
package org.thoughtcrime.securesms.util;
|
|
|
|
import android.annotation.SuppressLint;
|
|
import android.os.Build;
|
|
import android.os.MemoryFile;
|
|
import android.os.ParcelFileDescriptor;
|
|
|
|
import androidx.annotation.NonNull;
|
|
|
|
import org.thoughtcrime.securesms.dependencies.ApplicationDependencies;
|
|
|
|
import java.io.FileDescriptor;
|
|
import java.io.IOException;
|
|
import java.lang.reflect.Field;
|
|
import java.lang.reflect.InvocationTargetException;
|
|
import java.lang.reflect.Method;
|
|
|
|
public final class MemoryFileUtil {
|
|
|
|
private MemoryFileUtil() {}
|
|
|
|
public static ParcelFileDescriptor getParcelFileDescriptor(@NonNull MemoryFile file)
|
|
throws IOException
|
|
{
|
|
if (Build.VERSION.SDK_INT >= 26) {
|
|
return MemoryFileDescriptorProxy.create(ApplicationDependencies.getApplication(), file);
|
|
} else {
|
|
return getParcelFileDescriptorLegacy(file);
|
|
}
|
|
}
|
|
|
|
@SuppressWarnings("JavaReflectionMemberAccess")
|
|
@SuppressLint("PrivateApi")
|
|
public static ParcelFileDescriptor getParcelFileDescriptorLegacy(@NonNull MemoryFile file)
|
|
throws IOException
|
|
{
|
|
try {
|
|
Method method = MemoryFile.class.getDeclaredMethod("getFileDescriptor");
|
|
FileDescriptor fileDescriptor = (FileDescriptor) method.invoke(file);
|
|
|
|
Field field = fileDescriptor.getClass().getDeclaredField("descriptor");
|
|
field.setAccessible(true);
|
|
|
|
int fd = field.getInt(fileDescriptor);
|
|
|
|
return ParcelFileDescriptor.adoptFd(fd);
|
|
} catch (IllegalAccessException | InvocationTargetException | NoSuchMethodException | NoSuchFieldException e) {
|
|
throw new IOException(e);
|
|
}
|
|
}
|
|
}
|