精华内容
下载资源
问答
  • 用单片机根据sensor 控制串口摄像头图像采集和压缩处理,采集图像通过彩信的格式发送到用户手机,同时可以通过短信命令随时查看系统状态,或者摄像头采集图像,监控现场情况。  国内传统的电子防盗报警系统方案...
  • 用单片机根据sensor 控制串口摄像头图像采集和压缩处理,采集图像通过彩信的格式发送到用户手机,同时可以通过短信命令随时查看系统状态,或者摄像头采集图像,监控现场情况。  国内传统的电子防盗报警系统方案...
  • 【操作步骤】:编辑一条彩信,附件选择添加音频(外部音频),返回到编辑界面选择play,菜单键选择view slideshow 【测试结果】:不能播放,没有声音 【预期结果】:可以播放 根据以往的经验(之前也有一片博文涉及...

    【操作步骤】:编辑一条彩信,附件选择添加音频(外部音频),返回到编辑界面选择play,菜单键选择view slideshow
    【测试结果】:不能播放,没有声音

    【预期结果】:可以播放

    根据以往的经验(之前也有一片博文涉及到类似的功能)这里首先想到的是乱码,通过查看数据库,也证实了这个想法;

    因此,从文件管理器中共享一个中文文件名的音频文件(当然通过测试其他任何格式的文件包括图片,视频等只要是中文乱码则都有相同的问题)到短信中(文件管理器通过ACTION_SEND启动ComposeMessageActivity,该Activity在清单文件中注册了该Action);

    CompseMessageActivity通过handleSendIntent()方法来接受Intent中的数据:

    private boolean handleSendIntent() {
            Intent intent = getIntent();
            Bundle extras = intent.getExtras();
            if (extras == null) {
                return false;
            }

            final String mimeType = intent.getType();
            String action = intent.getAction();
            if (Intent.ACTION_SEND.equals(action)) {
                if (extras.containsKey(Intent.EXTRA_STREAM)) {
                    final Uri uri = (Uri)extras.getParcelable(Intent.EXTRA_STREAM);
                    getAsyncDialog().runAsync(new Runnable() {
                        @Override
                        public void run() {
                            mAttachFileUri = uri;
                            addAttachment(mimeType, uri, false);
                        }
                    }, null, R.string.adding_attachments_title);
                    return true;
                } else if (extras.containsKey(Intent.EXTRA_TEXT)) {
                    mWorkingMessage.setText(extras.getString(Intent.EXTRA_TEXT));
                    return true;
                }
            } else if ((Intent.ACTION_SEND_MULTIPLE.equals(action) &&
                    extras.containsKey(Intent.EXTRA_STREAM)) || mIsSendMultiple) {
                SlideshowModel slideShow = mWorkingMessage.getSlideshow();
                final ArrayList<Parcelable> uris = extras.getParcelableArrayList(Intent.EXTRA_STREAM);
                if (uris.size() > 0) {
                    mIsSendMultiple = true;
                }
                int currentSlideCount = slideShow != null ? slideShow.size() : 0;
                int importCount = uris.size();
                if (importCount + currentSlideCount > SlideshowEditor.MAX_SLIDE_NUM) {
                    importCount = Math.min(SlideshowEditor.MAX_SLIDE_NUM - currentSlideCount,
                            importCount);
                    Toast.makeText(ComposeMessageActivity.this,
                            getString(R.string.too_many_attachments,
                                    SlideshowEditor.MAX_SLIDE_NUM, importCount),
                                    Toast.LENGTH_LONG).show();
                }

                // Attach all the pictures/videos asynchronously off of the UI thread.
                // Show a progress dialog if adding all the slides hasn't finished
                // within half a second.
                final int numberToImport = importCount;
                getAsyncDialog().runAsync(new Runnable() {
                    @Override
                    public void run() {
                        for (int i = 0; i < numberToImport; i++) {
                            Parcelable uri = uris.get(i);
                            addAttachment(mimeType, (Uri) uri, true);
                        }
                        updateMmsSizeIndicator();
                    }
                }, null, R.string.adding_attachments_title);
                return true;
            }
            return false;
        }
    调用addAttachment()方法;
     

     private void addAttachment(String type, Uri uri, boolean append) {
            if (uri != null) {
                // When we're handling Intent.ACTION_SEND_MULTIPLE, the passed in items can be
                // videos, and/or images, and/or some other unknown types we don't handle. When
                // a single attachment is "shared" the type will specify an image or video. When
                // there are multiple types, the type passed in is "*/*". In that case, we've got
                // to look at the uri to figure out if it is an image or video.
                boolean wildcard = "*/*".equals(type);
                if (type.startsWith("image/")
                        || (wildcard && uri.toString().startsWith(mImageUri))
                        || (wildcard && isImageFile(uri))) {
                    addImage(uri, append);
                } else if (type.startsWith("video/")
                        || (wildcard && uri.toString().startsWith(mVideoUri))
                        || (wildcard && isVideoFile(uri))) {
                    addVideo(uri, append);
                } else if (type.startsWith("audio/")
                        || (wildcard && uri.toString().startsWith(mAudioUri))
                        || (wildcard && isAudioFile(uri))) {
                    addAudio(uri, append);
                } else if (SystemProperties.getBoolean("persist.env.mms.vcard", true)
                        && (type.equals("text/x-vcard")
                        || (wildcard && isVcardFile(uri)))) {
                    addVcard(uri);
                } else {
                    // Add prompt when file type is not image/video/audio.
                    Message msg = Message.obtain(mAddAttachmentHandler,
                            MSG_ADD_ATTACHMENT_FAILED, uri);
                    mAddAttachmentHandler.sendMessage(msg);
                }
            }
        }

    接下来会调用addVideo-->setAttachement()等方法进行设置附件,而这写操作均没有进行持久化操作。那么持久化操作在哪里呢?

    当我们添加过附件之后,去查看或者播放幻灯片的时候会首先对附件内容进行持久化操作。这里我们调用了MessageUtils.java中的viewMmsMessageAttachment()方法。

     public static void viewMmsMessageAttachment(final Activity activity, final Uri msgUri,
                final SlideshowModel slideshow, final int requestCode, AsyncDialog asyncDialog)
    {
            boolean isSimple = (slideshow == null) ? false : slideshow.isSimple();
            if (isSimple) {
                // In attachment-editor mode, we only ever have one slide.
                MessageUtils.viewSimpleSlideshow(activity, slideshow);
            } else {
                // The user wants to view the slideshow. We have to persist the slideshow parts
                // in a background task. If the task takes longer than a half second, a progress dialog
                // is displayed. Once the PDU persisting is done, another runnable on the UI thread get
                // executed to start the SlideshowActivity.
                asyncDialog.runAsync(new Runnable() {
                    @Override
                    public void run() {
                        // If a slideshow was provided, save it to disk first.
                        if (slideshow != null) {
                            PduPersister persister = PduPersister.getPduPersister(activity);
                            try {
                                PduBody pb = slideshow.toPduBody();
                                persister.updateParts(msgUri, pb, null);
                                slideshow.sync(pb);
                            } catch (MmsException e) {
                                Log.e(TAG, "Unable to save message for preview");
                                return;
                            }
                        }
                    }
                }, new Runnable() {
                    @Override
                    public void run() {
                        // Once the above background thread is complete, this runnable is run
                        // on the UI thread to launch the slideshow activity.
                        launchSlideshowActivity(activity, msgUri, requestCode);
                    }
                }, R.string.building_slideshow_title);
            }
        }
    上述代码中调用了PudPersister类中的updateParts()方法;

    public void updateParts(Uri uri, PduBody body, HashMap<Uri, InputStream> preOpenedFiles)
                throws MmsException {
            try {
                PduCacheEntry cacheEntry;
                synchronized(PDU_CACHE_INSTANCE) {
                    if (PDU_CACHE_INSTANCE.isUpdating(uri)) {
                        if (LOCAL_LOGV) {
                            Log.v(TAG, "updateParts: " + uri + " blocked by isUpdating()");
                        }
                        try {
                            PDU_CACHE_INSTANCE.wait();
                        } catch (InterruptedException e) {
                            Log.e(TAG, "updateParts: ", e);
                        }
                        cacheEntry = PDU_CACHE_INSTANCE.get(uri);
                        if (cacheEntry != null) {
                            ((MultimediaMessagePdu) cacheEntry.getPdu()).setBody(body);
                        }
                    }
                    // Tell the cache to indicate to other callers that this item
                    // is currently being updated.
                    PDU_CACHE_INSTANCE.setUpdating(uri, true);
                }

                ArrayList<PduPart> toBeCreated = new ArrayList<PduPart>();
                HashMap<Uri, PduPart> toBeUpdated = new HashMap<Uri, PduPart>();

                int partsNum = body.getPartsNum();
                StringBuilder filter = new StringBuilder().append('(');
                for (int i = 0; i < partsNum; i++) {
                    PduPart part = body.getPart(i);
                    Uri partUri = part.getDataUri();
                    if ((partUri == null) || TextUtils.isEmpty(partUri.getAuthority())
                            || !partUri.getAuthority().startsWith("mms")) {
                        toBeCreated.add(part);
                    } else {
                        toBeUpdated.put(partUri, part);

                        // Don't use 'i > 0' to determine whether we should append
                        // 'AND' since 'i = 0' may be skipped in another branch.
                        if (filter.length() > 1) {
                            filter.append(" AND ");
                        }

                        filter.append(Part._ID);
                        filter.append("!=");
                        DatabaseUtils.appendEscapedSQLString(filter, partUri.getLastPathSegment());
                    }
                }
                filter.append(')');

                long msgId = ContentUris.parseId(uri);

                // Remove the parts which doesn't exist anymore.
                SqliteWrapper.delete(mContext, mContentResolver,
                        Uri.parse(Mms.CONTENT_URI + "/" + msgId + "/part"),
                        filter.length() > 2 ? filter.toString() : null, null);

                // Create new parts which didn't exist before.
                for (PduPart part : toBeCreated) {
                    persistPart(part, msgId, preOpenedFiles);
                }


                // Update the modified parts.
                for (Map.Entry<Uri, PduPart> e : toBeUpdated.entrySet()) {
                    updatePart(e.getKey(), e.getValue(), preOpenedFiles);
                }

            } finally {
                synchronized(PDU_CACHE_INSTANCE) {
                    PDU_CACHE_INSTANCE.setUpdating(uri, false);
                    PDU_CACHE_INSTANCE.notifyAll();
                }
            }
        }
    根据上述代码我们可以发现,如果是第一次,也就是没有持久化的时候则会进行insert操作,如果已经执行过insert则会进行update操作,在之前的一篇博客中已经描述过具体的修改方法,这里不再详细赘述,只是把修改的内容给展示出来,其他操作请参考我之前写的一篇博客,地址为:http://blog.csdn.net/huangyabin001/article/details/27523961

     

    修改后:

    private void updatePart(Uri uri, PduPart part, HashMap<Uri, InputStream> preOpenedFiles)
                throws MmsException {
            ContentValues values = new ContentValues(7);

            int charset = part.getCharset();
            if (charset != 0 ) {
                values.put(Part.CHARSET, charset);
            }

            String contentType = null;
            if (part.getContentType() != null) {
                contentType = toIsoString(part.getContentType());
                values.put(Part.CONTENT_TYPE, contentType);
            } else {
                throw new MmsException("MIME type of the part must be set.");
            }

            if (part.getFilename() != null) {
                String fileName = new String(part.getFilename());
                values.put(Part.FILENAME, fileName);
            }

            if (part.getName() != null) {
                String name = new String(part.getName());
                values.put(Part.NAME, name);
            }

            String value = null;
            if (part.getContentDisposition() != null) {
                value = toIsoString(part.getContentDisposition());
                values.put(Part.CONTENT_DISPOSITION,value);
            }

            if (part.getContentId() != null) {
                byte[] byteContentId=part.getContentId();
                int encodeContentId=detectEncoding(byteContentId);
                try{
                    switch(encodeContentId){
                        case GB2312:
                            value=new String(byteContentId,"GB2312");
                        break;
                        case ASCII:
                            value=new String(byteContentId,"ASCII");
                        break;
                        case UTF8:
                            value=new String(byteContentId,"UTF-8");
                        break;
                        case UNICODE:
                            value=new String(byteContentId,"Unicode");
                        break;
                        default:
                            value = toIsoString(byteContentId);
                        break;
                    }
                    values.put(Part.CONTENT_ID, value);
                }catch(Exception e){
                    e.printStackTrace();
                }
            }

            if (part.getContentLocation() != null) {
                byte[] byteContentLocation=part.getContentLocation();
                int encodeContentLocation=detectEncoding(byteContentLocation);
                try{
                    switch(encodeContentLocation){
                        case GB2312:
                            value=new String(byteContentLocation,"GB2312");
                        break;
                        case ASCII:
                            value=new String(byteContentLocation,"ASCII");
                        break;
                        case UTF8:
                            value=new String(byteContentLocation,"UTF-8");
                        break;
                        case UNICODE:
                            value=new String(byteContentLocation,"Unicode");
                        break;
                        default:
                            value = toIsoString(byteContentLocation);
                        break;
                    }
                    values.put(Part.CONTENT_LOCATION,value);
                }catch(Exception e){
                    e.printStackTrace();
                }
            }

            SqliteWrapper.update(mContext, mContentResolver, uri, values, null, null);

            // Only update the data when:
            // 1. New binary data supplied or
            // 2. The Uri of the part is different from the current one.
            if ((part.getData() != null)
                    || (uri != part.getDataUri())) {
                persistData(part, uri, contentType, preOpenedFiles);
            }
        }
    修改前:

      private void updatePart(Uri uri, PduPart part, HashMap<Uri, InputStream> preOpenedFiles)
                throws MmsException {
            ContentValues values = new ContentValues(7);

            int charset = part.getCharset();
            if (charset != 0 ) {
                values.put(Part.CHARSET, charset);
            }

            String contentType = null;
            if (part.getContentType() != null) {
                contentType = toIsoString(part.getContentType());
                values.put(Part.CONTENT_TYPE, contentType);
            } else {
                throw new MmsException("MIME type of the part must be set.");
            }

            if (part.getFilename() != null) {
                String fileName = new String(part.getFilename());
                values.put(Part.FILENAME, fileName);
            }

            if (part.getName() != null) {
                String name = new String(part.getName());
                values.put(Part.NAME, name);
            }

            Object value = null;
            if (part.getContentDisposition() != null) {
                value = toIsoString(part.getContentDisposition());
                values.put(Part.CONTENT_DISPOSITION, (String) value);
            }

            if (part.getContentId() != null) {
                value = toIsoString(part.getContentId());
                values.put(Part.CONTENT_ID, (String) value);
            }

            if (part.getContentLocation() != null) {
                value = toIsoString(part.getContentLocation());
                values.put(Part.CONTENT_LOCATION, (String) value);
            }

            SqliteWrapper.update(mContext, mContentResolver, uri, values, null, null);

            // Only update the data when:
            // 1. New binary data supplied or
            // 2. The Uri of the part is different from the current one.
            if ((part.getData() != null)
                    || (uri != part.getDataUri())) {
                persistData(part, uri, contentType, preOpenedFiles);
            }
        }

     

     

    展开全文
  • 当发送MMS时,常常要用到增加附件功能,点击附件Button,将跳到第三方应用如图片查看器查看图片,然后选中一张图片,再跳回到MMS编辑界面,最后点击发送即把附件发送出去。Code: 首先在即将跳转到的第三方应用...

    当发送MMS时,常常要用到增加附件功能,点击附件Button,将跳到第三方应用如图片查看器查看图片,然后选中一张图片,再跳回到MMS编辑界面,最后点击发送即把附件发送出去。

    Code: 首先在即将跳转到的第三方应用Activity加上intent-filter 如:

    <intent-filter>

                    <action android:name="android.intent.action.GET_CONTENT" />

                    <category android:name="android.intent.category.OPENABLE" />

                    <category android:name="android.intent.category.DEFAULT" />

                    <data android:mimeType="*/*" />

    </intent-filter>

    这样之后将能过滤到此Activity的Intent,实际上,当点击附件Button时,MMS应用就对外broadCast一个Intent,在选中一张图片时,写上

    this.setResult(RESULT_OK , data);

     

    this.finish();

    data 一定得保存图片的真实Uri,然后finish掉此Activity即可

    特殊情况: 当需要在多个Activity之间跳转选择附件时,则需要借助startActivityForResult,实现Intent持续传递,

    操作流程: 占击Button附件 --------> 第三方app(First Activity) --------> Second Activity -----------> Three Activity ------->选中文件

     

    --------->返回至MMS编辑界面

    Code:

    First Activity 中  Intent intent = new Intent();

     intent.setClass(this,Second.class);

                             startActivityForResult(intent , requestCode);

    并覆写                protected void onActivityResult(int requestCode, int resultCode, Intent data) {

    this.setResult(RESULT_OK , data);

    this.finish();

                  };

     

    Second Activity 同上, 在 Three Activity 中, 给Intent设置数据Uri( setData(Uri uri)), 然后finish 此activity 将回到 SecondActivity 中的onActivityResult方法, 再回到FirstActivity, 最后回到MMS编辑界面,即可发送附件.

     

    展开全文
  • Now.SMS/MMSGateway 注册机

    热门讨论 2011-11-28 13:15:44
    这里必须使用对应的GPRS猫的调制解调(在控制面板-电话和调制解调选项-调制解调-添加,按照提示一步步就能找到GPRS猫,看好哪个调制解调对应哪个端口,从而知道哪个调制解调对应哪个GPRS猫)。填好这些...
  • android一些核心功能程序代码 ...6、时间选择 7、进度条 8、数据库绑定 10、发送短信程序 11:查看是否有存储卡插入 12:让某个Activity透明 15: 发送彩信 16: 发送Mail 17: 注册一个BroadcastReceiver ……
  • 3.7网页源码查看器 3.8联网提交数据 3.9对文件的操作 4.0制作一个截图软件 4.1局部变量和全局变量 4.2资源管理器的调用 4.3尝试语句 4.4条件语句 4.5循环语句 4.6不同类型之间的转换 4.7dir函数和解释器的使用 4.8...
  • 15、本软件提供非常强劲的录像回放及图片查看功能,在回放界面将显示每个文件的录像时间及结束时间,回放的过程中您可以捕获当前图片也可以以正常速度的1~10倍进行回放,以节省您的时间,同时可以旋转正在查看的图片...
  • 1、拥有完善的远程监控功能,远程监控对网络无特殊要求,不用任何设置,直接使用微方软件提供的免费远程服务账号即可方便的进行远程监控,可以通过IE浏览直接进行远程实时监控及录像的回放 。 (可以支持各种上网方式...
  • HTC桌面 FOR HD2

    2015-02-02 21:17:16
    -任务管理(任务切换和关闭,进程查看,状态查看和开关) -程序快捷方式(目前最多开放32个) -联系人快捷方式(目前最多开放32个) -短信的查看、回复、转发和删除 -公历、农历的查看(约会,任务,历史上的今天) -邮件的...
  • 1、拥有完善的远程监控功能,远程监控对网络无特殊要求,不用任何设置,直接使用微方软件提供的免费远程服务账号即可方便的进行远程监控,可以通过IE浏览直接进行远程实时监控及录像的回放 。 (可以支持各种上网方式...
  • Development.apk(Android Dev Tools)

    热门讨论 2013-08-21 10:06:08
    Android 键盘/Android 系统/API Domes/Certificate Installer(证书安装)/com.android.gestuer.builder()/com.android.sdksetup()/Custom Locale()/Dev Tools(开发工具)/Example Wallpapers(墙纸式样)/HTML查看器/...
  • 1、拥有完善的远程监控功能,远程监控对网络无特殊要求,不用任何设置,直接使用微方软件提供的免费远程服务账号即可方便的进行远程监控,可以通过IE浏览直接进行远程实时监控及录像的回放 。 (可以支持各种上网方式...
  • 1、拥有完善的远程监控功能,远程监控对网络无特殊要求,不用任何设置,直接使用微方软件提供的免费远程服务账号即可方便的进行远程监控,可以通过IE浏览直接进行远程实时监控及录像的回放 。 (可以支持各种上网方式...
  • Java zip压缩包查看程序源码 1个目标文件 摘要:Java源码,文件操作,压缩包查看 Java zip压缩包查看程序,应用弹出文件选择框,选择ZIP格式的压缩文件,可以像Winrar软件一样查看压缩文件内部的文件及文件夹,源码...
  • JAVA上百实例源码以及开源项目

    千次下载 热门讨论 2016-01-03 17:37:40
     Java zip压缩包查看程序,应用弹出文件选择框,选择ZIP格式的压缩文件,可以像Winrar软件一样查看压缩文件内部的文件及文件夹,源码截图如上所示。 Java 数字签名、数字证书生成源码 2个目标文件 摘要:JAVA源码,...
  • 梦缘网络

    2006-02-23 09:05:59
    加入社区(在线文苑,在线测试,天气查询,彩票中心,WISH祝福),在线翻译, 彩信下载,韩国网站推荐. 如有想加其他插件,本站会帮助安装和调试. 以下是源码功能介绍新增]网站系统模板功能,包括新闻、文章、下载、电影、商城...
  • 当CMPP连接建立完成后,会调用EndpointConnector.addChannel(channel)方法,把连接加入连接管理,连接负责给channel的pipeline上挂载业务处理的Handler,最后触发 SessionState.Connect事件,通知业务处理Handler...
  • java源码包---java 源码 大量 实例

    千次下载 热门讨论 2013-04-18 23:15:26
     Java zip压缩包查看程序,应用弹出文件选择框,选择ZIP格式的压缩文件,可以像Winrar软件一样查看压缩文件内部的文件及文件夹,源码截图如上所示。 Java 数字签名、数字证书生成源码 2个目标文件 摘要:JAVA源码,...
  • java源码包2

    千次下载 热门讨论 2013-04-20 11:28:17
     Java zip压缩包查看程序,应用弹出文件选择框,选择ZIP格式的压缩文件,可以像Winrar软件一样查看压缩文件内部的文件及文件夹,源码截图如上所示。 Java 数字签名、数字证书生成源码 2个目标文件 摘要:JAVA源码...
  • java源码包3

    千次下载 热门讨论 2013-04-20 11:30:13
     Java zip压缩包查看程序,应用弹出文件选择框,选择ZIP格式的压缩文件,可以像Winrar软件一样查看压缩文件内部的文件及文件夹,源码截图如上所示。 Java 数字签名、数字证书生成源码 2个目标文件 摘要:JAVA源码...
  • java源码包4

    千次下载 热门讨论 2013-04-20 11:31:44
     Java zip压缩包查看程序,应用弹出文件选择框,选择ZIP格式的压缩文件,可以像Winrar软件一样查看压缩文件内部的文件及文件夹,源码截图如上所示。 Java 数字签名、数字证书生成源码 2个目标文件 摘要:JAVA源码...
  • Java zip压缩包查看程序源码 1个目标文件 摘要:Java源码,文件操作,压缩包查看 Java zip压缩包查看程序,应用弹出文件选择框,选择ZIP格式的压缩文件,可以像Winrar软件一样查看压缩文件内部的文件及文件夹,源码...
  • Java zip压缩包查看程序源码 1个目标文件 摘要:Java源码,文件操作,压缩包查看 Java zip压缩包查看程序,应用弹出文件选择框,选择ZIP格式的压缩文件,可以像Winrar软件一样查看压缩文件内部的文件及文件夹,源码...
  • Android 开发技巧

    热门讨论 2012-03-26 10:24:42
    4.4.2、标题栏进度指示 50 4.4.3、titleBar 高级实现方法(更美观) 51 4.4.4、获取标题栏和状态栏高度 57 4.4.5、标题栏显示简单的进度框 57 4.5、MENU 58 4.5.1、简单的代码 58 4.5.2、menu实现的两种方法 58 ...
  • 4.4.2、标题栏进度指示 50 4.4.3、titleBar 高级实现方法(更美观) 51 4.4.4、获取标题栏和状态栏高度 57 4.4.5、标题栏显示简单的进度框 57 4.5、MENU 58 4.5.1、简单的代码 58 4.5.2、menu实现的两种方法 58 ...
  • C720 使用说明书

    2009-08-17 16:01:07
    3.6.5 查看计时................................................... 26 3.6.6 删除通话记录................................................. 26 3.6.7 筛选通话记录...........................................

空空如也

空空如也

1 2
收藏数 30
精华内容 12
关键字:

彩信查看器