主要导入的包
import android.os.Binder;
调用方法:通过insert进行填充:
private static long getAttachmentSize(Context context) {
Uri uri = Uri.parse("content://mms/attachment_size");
ContentValues insertValues = new ContentValues();
uri = context.getContentResolver().insert(uri, insertValues);
String size = uri.getQueryParameter("size");
return Long.parseLong(size);
}
在填充的过程中使用了一个固定的Uri,这个Uri中的attachment_size是这样的定义的:
<span style="font-family: Arial, Helvetica, sans-serif;">1.在MmsProvider中定义:</span>
private static final int MMS_ATTACHMENT_SIZE = 22;
<span style="font-family: Arial, Helvetica, sans-serif;">2.然后加入静态代码块中</span>
sURLMatcher.addURI("mms", "attachment_size", MMS_ATTACHMENT_SIZE); (有兴趣的读者可以去看源码MmsProvider.java这个类
<span style="font-family: Arial, Helvetica, sans-serif;">3.在调用insert方法时进行分类:</span>
<span style="font-family: Arial, Helvetica, sans-serif;">下面代码自行分析</span>
<span style="font-family: Arial, Helvetica, sans-serif;">4.做后再进行附件大小计算</span>
<span style="font-family: Arial, Helvetica, sans-serif;">insert方法</span>
@Override
public Uri insert(Uri uri, ContentValues values) {
<pre name="code" class="java"> // Don't let anyone insert anything with the _data column
if (values != null && values.containsKey(Part._DATA)) {
return null;
}
final int callerUid = Binder.getCallingUid();
int msgBox = Mms.MESSAGE_BOX_ALL;
boolean notify = true;
int match = sURLMatcher.match(uri);
if (LOCAL_LOGV) {
Log.v(TAG, "Insert uri=" + uri + ", match=" + match);
}
String table = TABLE_PDU;
switch (match) {
case MMS_ALL:
Object msgBoxObj = values.getAsInteger(Mms.MESSAGE_BOX);
if (msgBoxObj != null) {
msgBox = (Integer) msgBoxObj;
}
else {
// default to inbox
msgBox = Mms.MESSAGE_BOX_INBOX;
}
break;
……
<span style="white-space:pre"> </span> case MMS_ATTACHMENT_SIZE:
long size = getAttachmentsSize();
Log.e(TAG, "xxxx: invalid request: " + uri + " size=" + size);
uri = uri.buildUpon().appendQueryParameter("size", String.valueOf(size)).build();
return uri;
default:
Log.e(TAG, "insert: invalid request: " + uri);
return null;
}
……
}
<span style="font-family: Arial, Helvetica, sans-serif;">其中最后的Case部分为自己添加</span>
uri = uri.buildUpon().appendQueryParameter("size", String.valueOf(size)).build();
<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">将获取的大小填充到uri中,通过</span>
String size = uri.getQueryParameter("size");
<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">进行获取</span>
<span style="font-family: Arial, Helvetica, sans-serif;">下列方法为计算附件大小的方法:</span>
private long getAttachmentsSize() {
String[] projs = new String[] {
Mms.Part._DATA
};
// TODO: is there a predefined Uri like Mms.CONTENT_URI?
final Uri part = Uri.parse("content://mms/part/");
long token = Binder.clearCallingIdentity();
Cursor cursor = null;
try {
cursor = getContext().getContentResolver().query(part, projs, null, null, null);
} finally {
Binder.restoreCallingIdentity(token);
}
long size = 0;
try {
if (cursor == null || !cursor.moveToFirst()) {
Log.e(TAG, "getAttachmentsSize, cursor is empty or null");
return size;
}
Log.d(TAG, "getAttachmentsSize, count " + cursor.getCount());
do {
final String data = cursor.getString(0);
if (data != null) {
File file = new File(data);
Log.e(TAG, "getAttachmentsSize, file.exists()=" + file.exists() + " data=" +data);
if (file.exists()) {
size += file.length();
}
}
} while (cursor.moveToNext());
} finally {
Log.d(TAG, "getAttachmentsSize size = " + size);
if (cursor != null) {
cursor.close();
}
}
return size;
}
<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">其实就是计算文件的大小,不过这个方法只能在provider中进行再短信Mms苦衷是无法拿到的,因为Android的文件是私有的,所以其他应用拿到的值就是0;</span>