首页 > 代码库 > 解决:短信添加录音附件,录音,没有录音时间限制,超出彩信最大限制也正常录音

解决:短信添加录音附件,录音,没有录音时间限制,超出彩信最大限制也正常录音


【测试步骤】
短信添加录音附件,录音
【测试结果】
没有录音时间限制,超出彩信最大限制也正常录音
【预期结果】

应该有录音时间限制


首先分析是否因在彩信中没有没有在Intent中封装彩信剩余大小,定位到ComposeMessageActivity类的addAttachment()方法中:

 private void addAttachment(int type, boolean replace) {
        // Calculate the size of the current slide if we‘re doing a replace so the
        // slide size can optionally be used in computing how much room is left for an attachment.
        int currentSlideSize = 0;
        SlideshowModel slideShow = mWorkingMessage.getSlideshow();
        if (replace && slideShow != null) {
            WorkingMessage.removeThumbnailsFromCache(slideShow);
            SlideModel slide = slideShow.get(0);
            currentSlideSize = slide.getSlideSize();
        }
        switch (type) {
            case AttachmentTypeSelectorAdapter.ADD_IMAGE:
                MessageUtils.selectImage(this, REQUEST_CODE_ATTACH_IMAGE);
                break;

            case AttachmentTypeSelectorAdapter.TAKE_PICTURE: {
                MessageUtils.capturePicture(this, REQUEST_CODE_TAKE_PICTURE);
                break;
            }

            case AttachmentTypeSelectorAdapter.ADD_VIDEO:
                MessageUtils.selectVideo(this, REQUEST_CODE_ATTACH_VIDEO);
                break;

            case AttachmentTypeSelectorAdapter.RECORD_VIDEO: {
                long sizeLimit = computeAttachmentSizeLimit(slideShow, currentSlideSize);
                if (sizeLimit > 0) {
                    MessageUtils.recordVideo(this, REQUEST_CODE_TAKE_VIDEO, sizeLimit);
                } else {
                    Toast.makeText(this,
                            getString(R.string.message_too_big_for_video),
                            Toast.LENGTH_SHORT).show();
                }
            }
            break;

            case AttachmentTypeSelectorAdapter.ADD_SOUND:
                MessageUtils.selectAudio(this, REQUEST_CODE_ATTACH_SOUND);
                break;

            case AttachmentTypeSelectorAdapter.RECORD_SOUND:
                long sizeLimit = computeAttachmentSizeLimit(slideShow, currentSlideSize);
                MessageUtils.recordSound(this, REQUEST_CODE_RECORD_SOUND, sizeLimit);
                break;

            case AttachmentTypeSelectorAdapter.ADD_SLIDESHOW:
                editSlideshow();
                break;

            case AttachmentTypeSelectorAdapter.ADD_CONTACT_AS_TEXT:
                pickContacts(MultiPickContactsActivity.MODE_INFO,
                        replace ? REQUEST_CODE_ATTACH_REPLACE_CONTACT_INFO
                                : REQUEST_CODE_ATTACH_ADD_CONTACT_INFO);
                break;

            case AttachmentTypeSelectorAdapter.ADD_CONTACT_AS_VCARD:
                pickContacts(MultiPickContactsActivity.MODE_VCARD,
                        REQUEST_CODE_ATTACH_ADD_CONTACT_VCARD);
                break;

            default:
                break;
        }
    }

从以上代码中发现,这里的Intent中已经封装了彩信剩余大小的控制,因此该问题进入录音机界面进行分析:

经过分析发现,录音机应用并没有从Intent中取出对录音文件大小的控制。

修改方法:LemediaRecorder类的onCreate中进行修改:

 public void onCreate(Bundle icycle) {
        super.onCreate(icycle);
        stopRecorder();
        mSharedPreferences = getSharedPreferences("storage_Path", Context.MODE_PRIVATE);
        mPrefsStoragePathEditor = mSharedPreferences.edit();
        mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
        Intent i = getIntent();
        if (i != null) {   
            intentRecorder = true;
            final String EXTRA_MAX_BYTES
                 = android.provider.MediaStore.Audio.Media.EXTRA_MAX_BYTES;
mMaxFileSize = i.getLongExtra(EXTRA_MAX_BYTES, -1);

        }      
        if (AUDIO_ANY.equals(mRequestedType) || ANY_ANY.equals(mRequestedType)) {
            mRequestedType = AUDIO_AMR;
        }
        mPath = mSharedPreferences.getInt("path", mPath);
        //mRequestedType = mSharedPreferences.getString("requestedType", mRequestedType);
     mRequestedType = AUDIO_AMR;
        //mFileType = mSharedPreferences.getInt("fileType", mFileType);
     mFileType = 0;
        mStoragePath = mSharedPreferences.getString("storagePath", mStoragePath);
        if (!mWAVSupport && mRequestedType == AUDIO_WAVE_2CH_LPCM) {
            mRequestedType = AUDIO_AMR;
            mFileType = 0;
        }
        setContentView(R.layout.main);
        mAudioManager = (AudioManager)getSystemService(Context.AUDIO_SERVICE);
        mRecorder = new Recorder();
        mRecorder.setOnStateChangedListener(this);
        mRemainingTimeCalculator = new RemainingTimeCalculator(LemediaRecorder.this);
        PowerManager pm
            = (PowerManager) getSystemService(Context.POWER_SERVICE);
        mWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,
                                    "LemediaRecorder");
        initResourceRefs();
        mRecorderStop = false;
        mDataExist = false;
        setResult(RESULT_CANCELED);
        registerExternalStorageListener();   
        if (icycle != null) {
            Bundle recorderState = icycle.getBundle(RECORDER_STATE_KEY);
            if (recorderState != null) {
                mRecorder.restoreState(recorderState);
                mSampleInterrupted = recorderState.getBoolean(SAMPLE_INTERRUPTED_KEY, false);
                mMaxFileSize = recorderState.getLong(MAX_FILE_SIZE_KEY, -1);

                int showAndExit = recorderState.getInt(DIALOG_STATE_KEY);
                mLastFileName = recorderState.getString(LAST_FILE_NAME_KEY);
                if (showAndExit != -1) showDialogAndExit(showAndExit == 1);
            }
        }    
        mTelephonyManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
        mPhoneStateListener = getPhoneStateListener();
        String ssrRet = mAudioManager.getParameters("ssr");
        if (ssrRet.contains("=true")) {
            bSSRSupported = true;
        } else {
            bSSRSupported = false;
        }
            updateUi();
    }

问题OK,搞定!