计算彩信的附件大小

主要导入的包

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>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值