mms 附件 分析

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lf12345678910/article/details/54668398

packages/apps/Mms/src/com/android/mms/ui/

ComposeMessageActivity.java

onClick(){

 else if ((v == mAddAttachmentButton)) {
            if (mAttachmentSelector.getVisibility() == View.VISIBLE && !mIsReplaceAttachment) {
                mAttachmentSelector.setVisibility(View.GONE);
            } else {
                showAttachmentSelector(false);
                if (mWorkingMessage.hasAttachment()) {
                    Toast.makeText(this, R.string.add_another_attachment, Toast.LENGTH_SHORT)
                            .show();
                }
            }

}

showAttachmentSelector(){//

        mAttachmentPagerAdapter.setGridItemClickListener(new OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                if (view != null) {
                    addAttachment((mCurrentAttachmentPager > DEFAULT_ATTACHMENT_PAGER ? position
                            + mAttachmentPagerAdapter.PAGE_GRID_COUNT : position), replace);
                    if (mIsRTL) {
                        addAttachment((mCurrentAttachmentPager > DEFAULT_ATTACHMENT_PAGER ? position
                            : mAttachmentPagerAdapter.PAGE_GRID_COUNT + position), replace);
                    }
                    mAttachmentSelector.setVisibility(View.GONE);
                }
            }
        });

}

addAttachment(){//添加附件

            case AttachmentPagerAdapter.TAKE_PICTURE: {
                MessageUtils.capturePicture(this,
                        getMakRequestCode(replace, REQUEST_CODE_TAKE_PICTURE));
                break;
            }

}

onActivityResult(){

            case REQUEST_CODE_TAKE_PICTURE: {
                // create a file based uri and pass to addImage(). We want to read the JPEG
                // data directly from file (using UriImage) instead of decoding it into a Bitmap,
                // which takes up too much memory and could easily lead to OOM.
                File file = new File(TempFileProvider.getScrapPath(this));
                Uri uri = Uri.fromFile(file);

                // Remove the old captured picture's thumbnail from the cache
                MmsApp.getApplication().getThumbnailManager().removeThumbnail(uri);

                addImageAsync(uri, append);
                break;
            }

}

    private void addImageAsync(final Uri uri, final boolean append) {
        mInAsyncAddAttathProcess = true;
        getAsyncDialog().runAsync(new Runnable() {
            @Override
            public void run() {
                addImage(uri, append);
                mInAsyncAddAttathProcess = false;
            }
        }, null, R.string.adding_attachments_title);
    }

private void addImage(final Uri uri, final boolean append) {
        if (Log.isLoggable(LogTag.APP, Log.VERBOSE)) {
            log("addImage: append=" + append + ", uri=" + uri);
        }

        int result = mWorkingMessage.setAttachment(WorkingMessage.IMAGE, uri, append);
Log.d(TAG, "result: " + result);

        if (result == WorkingMessage.IMAGE_TOO_LARGE ||
            result == WorkingMessage.MESSAGE_SIZE_EXCEEDED) {//图像太大,最新压缩
            if (Log.isLoggable(LogTag.APP, Log.VERBOSE)) {
                log("resize image " + uri);
            }
            mResizeImageCount ++;
            MessageUtils.resizeImageAsync(ComposeMessageActivity.this,
                    uri, mWorkingMessage.hasSlideshow() ? mWorkingMessage.getSlideshow()
                            .getCurrentMessageSize() : 0, mAttachmentEditorHandler,
                    mResizeImageCallback, append);
            return;
        }
Log.d(TAG, "isCreationModeEnabled: " + MmsConfig.isCreationModeEnabled());
        if ((MmsConfig.isCreationModeEnabled())
                && (result == WorkingMessage.UNSUPPORTED_TYPE_WARNING)) {
            final Runnable runnable = new Runnable() {
                @Override
                public void run() {
                    addImage(uri, append);
                }
            };

packages/apps/Mms/src/com/android/mms/data/

WorkingMessage.java

setAttachment(){ changeMedia() }

internalChangeMedia(){ if (type == IMAGE) {slideShowEditor.changeImage(slideNum, uri); }

SlideshowEditor.java

    public void changeImage(int position, Uri newImage) throws MmsException {
        mModel.get(position).add(new ImageModel(
                mContext, newImage, mModel.getLayout().getImageRegion()));
    }

SlideshowModel.java

add()

SlideModel.java

internalAdd()---> internalAddOrReplace(mImage, media){ mParent.checkMessageSize(addSize); }

SlideshowModel.java

    public void checkMessageSize(int increaseSize) throws ContentRestrictionException {
        ContentRestriction cr = ContentRestrictionFactory.getContentRestriction();
        cr.checkMessageSize(mCurrentMessageSize, increaseSize, mContext.getContentResolver());
    }

CarrierContentRestriction.java

checkMessageSize(){

        // 0, and MmsConfig.getMaxMessageSize() - SlideshowModel.SLIDESHOW_SLOP is limitation.
        // Reserve SlideshowModel.SLIDESHOW_SLOP(1k) for overhead.
        if ( (newSize < 0) || ((newSize + SlideshowModel.SLIDESHOW_SLOP)
                      > MmsConfig.getMaxMessageSize() )) {
            throw new ExceedMessageSizeException(
                    "Exceed message size limitation").putMmsSize(newSize);

}

MessageUtils.java

resizeImageAsync(){

                    UriImage image = new UriImage(context, imageUri);
                    int widthLimit = MmsConfig.getMaxImageWidth();
                    int heightLimit = MmsConfig.getMaxImageHeight();

                    part = image.getResizedImageAsPart(
                        widthLimit,
                        heightLimit,
                        MmsConfig.getMaxMessageSize() - currentMsgSize - MESSAGE_OVERHEAD);
                    Log.d(TAG, "part="+part.getDataLength());
                } finally {
                    // Cancel pending show of the progress toast if necessary.
                    handler.removeCallbacks(showProgress);
                }

                handler.post(new Runnable() {
                    @Override
                    public void run() {
                        cb.onResizeResult(part, append);//ComposeMessageActivity
                    }
                });
            }
        }, "MessageUtils.resizeImageAsync").start();

}

UriImage.java

getResizedImageAsPart(){}

getResizedImageData(){

        float scaleFactor = 1.F;
        while ((outWidth * scaleFactor > widthLimit) || (outHeight * scaleFactor > heightLimit)) {
            scaleFactor *= .75F;
        }

    /**
     * The quality parameter which is used to compress JPEG images.
     */
    public static final int IMAGE_COMPRESSION_QUALITY = 95;
    /**
     * The minimum quality parameter which is used to compress JPEG images.
     */
    public static final int MINIMUM_IMAGE_COMPRESSION_QUALITY = 50;

}

ComposeMessageActivity.java

    private final ResizeImageResultCallback mResizeImageCallback = new ResizeImageResultCallback() {
        // TODO: make this produce a Uri, that's what we want anyway
        @Override
        public void onResizeResult(PduPart part, boolean append) {
            synchronized (mObjectLock) {
                mResizeImageCount = mResizeImageCount - 1;
                if (mResizeImageCount <= 0) {
                    log("finish resize all images.");
                    mObjectLock.notifyAll();
                }
            }

            if (part == null) {
                handleAddAttachmentError(WorkingMessage.UNKNOWN_ERROR, R.string.type_picture);
                return;
            }

            Context context = ComposeMessageActivity.this;
            PduPersister persister = PduPersister.getPduPersister(context);
            int result;

            Uri messageUri = mWorkingMessage.saveAsMms(true);
            if (messageUri == null) {
                result = WorkingMessage.UNKNOWN_ERROR;
            } else {
                try {
                    Uri dataUri = persister.persistPart(part,
                            ContentUris.parseId(messageUri), null);
                    result = mWorkingMessage.setAttachment(WorkingMessage.IMAGE, dataUri, append);
                    if (Log.isLoggable(LogTag.APP, Log.VERBOSE)) {
                        log("ResizeImageResultCallback: dataUri=" + dataUri);
                    }
                } catch (MmsException e) {
                    result = WorkingMessage.UNKNOWN_ERROR;
                }
            }

            updateMmsSizeIndicator();
            drawBottomPanel();
            handleAddAttachmentError(result, R.string.type_picture);
        }
    };

猜你喜欢

转载自blog.csdn.net/lf12345678910/article/details/54668398
今日推荐