Tôi muốn viết một số byte vào bộ nhớ dùng chung. Điều này được thực hiện trong ứng dụng của tôi1. Từ một ứng dụng khác của tôi: application2 Tôi muốn truy cập bộ nhớ chia sẻ đó để đọc các byte được ghi. Với mục đích này, tôi đã thử sử dụng lớp MemoryFile của android. Tôi đang mắc kẹt như thế nào để tham khảo cùng một bộ nhớ phân đoạn giữa hai ứng dụng khác nhau. Tôi cũng đang bối rối nếu memoryFile được sử dụng cho cùng một mục đích hay không. http://developer.android.com/reference/android/os/MemoryFile.html liên kết này tôi đã tìm thấy về chủ đề. Cảm ơn trước. Krishnaviệc sử dụng MemoryFile trong android
Trả lời
Nếu bạn muốn có một số sử dụng cross-trình với MemoryFile
bạn có thể sử dụng sau fugly phương pháp:
import android.os.MemoryFile;
import android.os.ParcelFileDescriptor;
import java.io.FileDescriptor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class MemoryFileUtil {
private static final Method sMethodGetParcelFileDescriptor;
private static final Method sMethodGetFileDescriptor;
static {
sMethodGetParcelFileDescriptor = get("getParcelFileDescriptor");
sMethodGetFileDescriptor = get("getFileDescriptor");
}
public static ParcelFileDescriptor getParcelFileDescriptor(MemoryFile file) {
try {
return (ParcelFileDescriptor) sMethodGetParcelFileDescriptor.invoke(file);
} catch (IllegalAccessException e) {
throw new RuntimeException(e);
} catch (InvocationTargetException e) {
throw new RuntimeException(e);
}
}
public static FileDescriptor getFileDescriptor(MemoryFile file) {
try {
return (FileDescriptor) sMethodGetFileDescriptor.invoke(file);
} catch (IllegalAccessException e) {
throw new RuntimeException(e);
} catch (InvocationTargetException e) {
throw new RuntimeException(e);
}
}
private static Method get(String name) {
try {
return MemoryFile.class.getDeclaredMethod(name);
} catch (NoSuchMethodException e) {
throw new RuntimeException(e);
}
}
}
Những gì bạn nên nhìn vào là #getParcelFileDescriptor(MemoryFile)
phương pháp mà bạn có thể trở về từ một thực hiện của ContentProvider#openFile(Uri, String)
.
Tôi nghi ngờ mã của tôi ném ngoại lệ tại MemoryFile.class.getDeclaredMethod ("getParcelFileDescriptor"); nhưng nó không thực sự goto bắt khoản tôi biết chỉ sau khi đặt một breakpoint có –
Tôi thực sự không nhận được nó. Nếu tất cả các bạn đang làm là đi qua một FD, tại sao sử dụng ashmem ở tất cả? Bạn chỉ có thể sử dụng ParcelFileDescriptor.createPipe() và viết bất kỳ dữ liệu cục bộ nào bạn muốn trên nó. Không yêu cầu ashmem. –
Tôi nghi ngờ tệp bộ nhớ không có phương thức getParcelFileDescriptor. Khi tôi nhận xét phương thức getParcelFileDescriptor liên quan này và sử dụng getFileDescriptor. Nó hoạt động rất tốt.
import java.io.FileDescriptor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import android.os.MemoryFile;
/**
* Invoke hidden methods using reflection
*
*/
public class MemoryFileUtil {
private static final Method sMethodGetFileDescriptor;
static {
sMethodGetFileDescriptor = get("getFileDescriptor");
}
public static FileDescriptor getFileDescriptor(MemoryFile file) {
try {
return (FileDescriptor) sMethodGetFileDescriptor.invoke(file);
} catch (IllegalAccessException e) {
throw new RuntimeException(e);
} catch (InvocationTargetException e) {
throw new RuntimeException(e);
}
}
private static Method get(String name) {
try {
return MemoryFile.class.getDeclaredMethod(name);
} catch (NoSuchMethodException e) {
throw new RuntimeException(e);
}
}
}
Và mô tả tệp được tạo từ tệp bộ nhớ.
FileDescriptor fd = MemoryFileUtil.getFileDescriptor(memFile);
MemoryFile có thể được sử dụng để ánh xạ tới bộ nhớ vật lý. Bộ mô tả tệp kết quả (fd) có thể được truyền cho máy khách (bên chia sẻ bộ nhớ). Máy khách có thể ánh xạ cùng một fd gốc đến cùng vùng bộ nhớ. Bộ nhớ sau đó có thể được chia sẻ bằng cách sử dụng fd bản địa, có thể được ánh xạ tới lớp java bằng cách sử dụng InputStream.
Vui lòng tham khảo link này để biết thêm chi tiết:
Sharing memory using ashem.
- 1. Việc sử dụng BaseColumns trong Android
- 2. Android: Việc sử dụng thư viện ActionBarSherlock
- 3. Việc sử dụng quyền Android Wake Lock là gì?
- 4. android: layout_alignParentBottom = "true" với việc sử dụng bàn phím
- 5. mục đích của việc sử dụng Intent.createChooser() trong startActivity() trong khi gửi email trong Android
- 6. Việc sử dụng allowCoreThreadTimeout() trong ThreadPoolExecutor là gì?
- 7. Việc sử dụng @SuppressWarnings
- 8. Sử dụng putSerializable trong Android
- 9. Sử dụng JDO trong Android
- 10. Sử dụng onDestroy() trong android
- 11. ANR trong việc sử dụng ngẫu nhiên ứng dụng
- 12. Việc sử dụng/lợi thế của việc sử dụng CommandBehavior.CloseConnection trong ExecuteReader()
- 13. Việc sử dụng CoTaskMemAlloc?
- 14. Việc sử dụng extern trong C++
- 15. Việc sử dụng moveToFirst() trong SQLite Cursors
- 16. Việc sử dụng session.flush() trong Hibernate
- 17. Việc sử dụng "này" trong Java
- 18. Việc sử dụng Jackson & Jettison trong Jersey
- 19. Nhược điểm của việc sử dụng Basic4Android?
- 20. Hướng dẫn sử dụng Hibernate trong Android?
- 21. Animate Text Sử dụng TextSwitcher Trong Android
- 22. Việc sử dụng <permission-group> trong android là gì?
- 23. Lợi ích của việc sử dụng flush() close() trong luồng Android?
- 24. cách đo và cải thiện việc sử dụng pin trong trò chơi iPhone/iPad (Android cũng)
- 25. Mục đích của việc sử dụng System.img trong Android là gì?
- 26. việc sử dụng cho "repo sync -d" trong kho lưu trữ nguồn Android là gì
- 27. Android: Sử dụng Danh mục trong Monkey
- 28. Cách sử dụng TextSwitcher Trong Android
- 29. Sử dụng C2DM trong Android-x86
- 30. Sử dụng onBackPressed() trong Android Fragments
Tôi nghĩ rằng "chính thức" đường để đi là sử dụng một nhà cung cấp nội dung, hoặc sử dụng một tập tin thường xuyên về lưu trữ bên ngoài. –
+1 cho ContentProvider/ContentResolver – Guillaume
kích thước của nội dung lớn (3-4 MB) và tôi cần viết nhanh, vì vậy tôi cần một cái gì đó giống như bộ nhớ dùng chung. Ngoài ra xin vui lòng nếu bạn có thể giúp tôi hiểu việc sử dụng memoryFile trong Android. –