知識社群登入
位置: 艾鍗學院 Blog > 專業論壇 > 討論
MMS傳送問題
1樓
請問我在Android上透過Intent呼叫簡訊程式,並希望能加入圖片檔案,但是都會出現ERROR,以下是我的程式碼及錯誤訊息,請各位先進指教,謝謝

        String url = "file://sdcard/sunset.jpg";
        Intent shareIntent = new Intent(Intent.ACTION_SEND);
        shareIntent.setType("image/jpeg");
        shareIntent.putExtra("address", "5554");
        shareIntent.putExtra("sms_body", "mms test");
        shareIntent.putExtra(Intent.EXTRA_STREAM, Uri.parse(url));
        startActivity(shareIntent) ;

程式可以執行,但是無法附加檔案,會出現ERROR的TOAST
"Sorry,you cannot add this picture to your message."
2樓
你符加的圖檔size是否太大了?
android內建的message app是有限制圖檔的大小.
你可以上market找其他message app來替換掉android原生內建的.
例如handcent、chompsms都是可以調整單檔大小的message app.
3樓
jarey老師
您說的部份我會去嘗試,謝謝
另外,修改上述程式碼,我可以直接將gallery內的圖檔附加至MMS的activity,但是圖檔路徑變成content://media/external/images/media/2,請問老師是否有方法可以透過上述路徑轉換成檔案的絕對路徑(或將圖檔的絕對路徑轉成context://開頭的路徑)?此外,當出現MMS SEND的activity後有方法直接SEND MMS而不需要使用者點擊傳送按鈕嗎?

                Intent sendIntent = new Intent(Intent.ACTION_SEND);
                sendIntent.setType("image/jpeg");
                sendIntent.putExtra("address", "5554");
                sendIntent.putExtra("sms_body", "mms test");
                sendIntent.putExtra(Intent.EXTRA_STREAM, Uri.parse(uploadFile));
                startActivity(sendIntent);
其中uploadFile是透過Intent.ACTION_PICK及onActivityResult取得

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);       
        if ( resultCode == RESULT_OK )
        {
            Uri uri = data.getData();
            if( uri != null )
            {
                iv = (ImageView)this.findViewById(R.id.imageView1);
                iv.setImageURI( uri );
               
                uploadFile = uri.toString();
                uploadfileText = (TextView) findViewById(R.id.textView1);
                uploadfileText.setText("檔案路徑: \n"+uploadFile);
               
            }
            else
            {
                uploadfileText = (TextView) findViewById(R.id.textView1);
                uploadfileText.setText("無效的檔案路徑 !!");
            }
        }
        else
        {
            uploadfileText = (TextView) findViewById(R.id.textView1);
            uploadfileText.setText("取消選擇檔案 !!");
        }
    }
}
4樓
Terry:

首先如果你透過Intent去呼叫OS請求利用手機內的相簿軟體來幫你選取要上傳的圖片, 如果這個取得的圖片只是單純的要直接透過MMS出去, 那是可以無需要知道路徑的, 因為取得的uri可以直接放入extra裡,就可以發送該圖了. 
如下範例:
  1. Uri uri = Uri.parse("content://media/external/images/media/2");  
  2. it.setType("image/png");  
  3. Intent it = new Intent(Intent.ACTION_SEND);   
  4. it.putExtra("address""5554");   
  5. it.putExtra("sms_body""mms test")
  6. it.putExtra(Intent.EXTRA_STREAM, uri);  
  7. startActivity(it);  

但如果你取得路徑是另外有所作用,例如要將路徑寫到資料庫裡或顯示出來給用戶看到是指到那一個路徑檔:
因為實際的檔案路徑是存在DataBase欄位中,其欄位代號可以利用MediaStore.Images.Media.DATA
這個常數取得,接著利用managedQuery進行data query,在將查尋得到的cursor表中,取得你要的路徑
欄位資料即可, 可參考以下程式碼:

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

  if (resultCode == RESULT_OK) {  

Uri uri = data.getData();  
String[] sqlSet = { MediaStore.Images.Media.DATA };
Cursor cursor = managedQuery(uri, sqlSet, null, null, null);
cursor.moveToFirst();
String imagePath= cursor.getString(
cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA));
Log.i(this.getClass().getName()+":getUriPath:",imagePath);
  }
}


最得你問到的是否可以直接傳送MMS而不需要用戶在按擊確認按鈕:

基本上MMS需要透過特別的APN通道去傳送,走的是http的protocol.

利用系統的Intent請求發送做法是較普遍也比較簡單的,缺點是需要暫時離開你的應用程式

去跑另一個發送的軟體頁面,而這個頁面可能設計UI配色與風格與你本身的軟體完全不符。

如需要自行發送MMS可以參考以下這幾篇文章,裡面有詳細的說明:




5樓
謝謝Jarey老師的回應,您真是熱心的好老師