查看完整版本: android圖片寄信
頁: [1]

晴符o 發表於 2016-3-17 07:20 PM

android圖片寄信

如題
目前使用android studio寫一份寄信程式
我使用的是Javamail的方式來寄信
但目前遇到的問題是可以將主旨和內容寄出,但我不知道圖片可以用怎樣的寫法來解決寄出的問題
現在是使用照相後將所照圖片貼到imageview元件上
但該怎麼將在元件上的圖片寄出呢?
有聽別人說可以使用MIME等的...但尋找後還是一頭霧水
麻煩知道的大大幫幫小小新手

<div></div>

chevylin0802 發表於 2016-3-18 12:40 PM

你搞錯了

ImageView元件是不可能直接當成郵件內容寄出去的
而是圖片要先存檔
一般都是存成JPG的檔案
然後把JPG檔當成附件的方式
也就是setAttachment的方式來做
MIME的問題可以不用去管

chevylin0802 發表於 2016-3-18 10:56 PM

public void addAttachment(String filename) throws Exception {
    BodyPart messageBodyPart = new MimeBodyPart();
    DataSource source = new FileDataSource(filename);
    messageBodyPart.setDataHandler(new DataHandler(source));
    messageBodyPart.setFileName(filename);

    _multipart.addBodyPart(messageBodyPart);
  } 你看這個是不是你要的

http://www.jondev.net/articles/Sending_Emails_without_User_Intervention_%28no_Intents%29_in_Android

晴符o 發表於 2016-3-19 11:49 AM

本帖最後由 晴符o 於 2016-3-19 11:50 AM 編輯

大概是小弟愚鈍...看了後也不知道如何下手
下面大概是我的程式碼

SendMail.javapublic class SendMail extends AsyncTask<Void,Void,Void> {

    private Context context;
    private Session session;
    private String email;
    private String subject;
    private String message;


    private ProgressDialog progressDialog;


    public SendMail(Context context, String email, String subject, String message){

        this.context = context;
        this.email = email;
        this.subject = subject;
        this.message = message;
    }

    @Override
    protected void onPreExecute() {
        super.onPreExecute();

        progressDialog = ProgressDialog.show(context,"Sending message","Please wait...",false,false);
    }

    @Override
    protected void onPostExecute(Void aVoid) {
        super.onPostExecute(aVoid);

        progressDialog.dismiss();

        Toast.makeText(context,"Message Sent",Toast.LENGTH_LONG).show();
    }


    @Override
    protected Void doInBackground(Void... params) {

        Properties props = new Properties();


        props.put("mail.smtp.host", "smtp.gmail.com");
        props.put("mail.smtp.socketFactory.port", "465");
        props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
        props.put("mail.smtp.auth", "true");
        props.put("mail.smtp.port", "465");


        session = Session.getDefaultInstance(props,
                new javax.mail.Authenticator() {
                    //Authenticating the password
                    protected PasswordAuthentication getPasswordAuthentication() {
                        return new PasswordAuthentication(Config.EMAIL, Config.PASSWORD);
                    }
                });

        try {

            MimeMessage mm = new MimeMessage(session);


            mm.setFrom(new InternetAddress(Config.EMAIL));
            mm.addRecipient(Message.RecipientType.TO, new InternetAddress(email));
            mm.setSubject(subject);
            mm.setText(message);

            Transport.send(mm);

        } catch (MessagingException e) {
            e.printStackTrace();
        }
        return null;
    }
}MainActivity.javapublic class MainActivity extends AppCompatActivity implements View.OnClickListener {

    private EditText editTextEmail;
    private EditText editTextSubject;
    private EditText editTextMessage;
    private Button buttonSend;
    Button button1;
    ImageView image1;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        editTextEmail = (EditText) findViewById(R.id.editTextEmail);
        editTextSubject = (EditText) findViewById(R.id.editTextSubject);
        editTextMessage = (EditText) findViewById(R.id.editTextMessage);
        image1=(ImageView)findViewById(R.id.image1);
        button1=(Button)findViewById(R.id.button1);
        buttonSend = (Button) findViewById(R.id.buttonSend);

        buttonSend.setOnClickListener(this);
        button1.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent i =new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                startActivityForResult(i, 101);
            }
        });
    }

    @Override
    protected void onActivityResult(int requestCode,int resultCode,Intent data){
        super.onActivityResult(requestCode, resultCode, data);
        if (resultCode==Activity.RESULT_OK&&requestCode==101)
        {
            Bundle extras = data.getExtras();
            Bitmap bmp =(Bitmap)extras.get("data");
            image1.setImageBitmap(bmp);
        }
        else {
            Toast.makeText(this,"沒照到!",Toast.LENGTH_LONG).show();
        }
    }




    private void sendEmail() {
        String email = editTextEmail.getText().toString().trim();
        String subject = editTextSubject.getText().toString().trim();
        String message = editTextMessage.getText().toString().trim();

        SendMail sm = new SendMail(this, email, subject, message);

        sm.execute();
    }

    @Override
    public void onClick(View v) {
        sendEmail();
    }
}
Config.javapublic class Config {
    //我的郵件帳號密碼
    public static final String EMAIL ="xxx@gmail.com";
    public static final String PASSWORD ="yyy";
}佈局activity_main.xml<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:paddingBottom="@dimen/activity_vertical_margin"
    tools:context=".MainActivity">

    <TextView
        android:text="請輸入電子信箱:"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
    <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/editTextEmail" />
    <TextView
        android:text="請輸入內容:"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
    <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/editTextSubject" />
    <TextView
        android:text="請輸入內容:"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
    <EditText
        android:lines="3"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/editTextMessage" />
    <ImageView
        android:layout_width="300dp"
        android:layout_height="150dp"
        android:id="@+id/image1"/>
    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/button1"
        android:text="照相"/>
    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/buttonSend"
        android:text="寄出"/>

</LinearLayout>以上是參考別人的程式碼(突然找不到網址)再加上相機程式

請問我開該從哪下手可以解決我的問題呢?...<div class='locked'><em>瀏覽完整內容,請先 <a href='member.php?mod=register'>註冊</a> 或 <a href='javascript:;' onclick="lsSubmit()">登入會員</a></em></div>

chevylin0802 發表於 2016-3-19 04:28 PM

本帖最後由 chevylin0802 於 2016-3-19 04:40 PM 編輯

晴符o 發表於 2016-3-19 11:49 AM static/image/common/back.gif
大概是小弟愚鈍...看了後也不知道如何下手
下面大概是我的程式碼


你原先參考的範例寫得很不好

我另外給你一個參考網址

http://blog.csdn.net/silangquan/article/details/8774362

你根據這個範例去修改
主程式有一行  m.setBody("Email body.");   
在這一行後面再加上 m.addAttachment(imagePath);
其中imagePath就要指向到你照相所儲存的相片檔字串

現在你比較麻煩的是你的照相程式本身還有一點點困擾
你有讀到bmp而且也把bmp丟給了ImageView
但它還需要轉換成jpeg存檔

不過這個部份你可以自己去找如何把ImageView裏的內容儲存成jpeg相片檔
自己去google一下就找得到方法
這麼一來應該就可以了



...<div class='locked'><em>瀏覽完整內容,請先 <a href='member.php?mod=register'>註冊</a> 或 <a href='javascript:;' onclick="lsSubmit()">登入會員</a></em></div><br><br><br><br><br><div></div>

chevylin0802 發表於 2016-3-19 05:13 PM

本帖最後由 chevylin0802 於 2016-3-19 05:41 PM 編輯

chevylin0802 發表於 2016-3-19 04:28 PM static/image/common/back.gif
你原先參考的範例寫得很不好

我另外給你一個參考網址

郵件的基本結構
有寄件者
有收件者
有CC
有主旨
有內容
有附件

拿到範例程式後
你應該自己去做筆記
搞清楚這些東西

而郵件信箱有幾個主要的內容
smtp server
pop3 server
以及帳號與密碼

所以你在寫程式之前要先把這些東西抓出來
因為它是要根據你自己的需要去填入或者去修改

所以你應該先去搞清楚javamail的api文件
先了解清楚api有什麼

我知道很多人拿別人的範例修改
都有一個壞習慣就是拿來就直接先沿用先測試
這當然也不是不對或不好
但往往都因為沒有搞懂程式範例在寫什麼
所以要大幅修改的時候就掛了

我當然也可以花幾個小時自己做一個範例給你
可是即使範例拿到手不需要做任何修改
又如何?

曾幾何時我曾經修改過一個注音輸入法
讓它不只可以用觸控或用滑鼠去點鍵盤
還可以用遙控器上的上下左右鍵去選
原先他們已經去找了合作廠商要買別人的app授權
我花了一天半的時間改好給公司真正在做android app的team去用
因此他們不需要再去花錢做
但問題是交給他們裏面還包括原始碼
他們卻還額外花了三個多月去修改成出貨版本
因為tvbox不可能再去配滑鼠跟鍵盤給使用者
可是三個多月的時間
我也沒看到他們修改了些什麼

其實我不是做android app的
因為我不喜歡做UI層的工作
因為沒know how
你會的別人也一樣會
我給它計算過
同樣的規格與同樣的UI跟操作
我做的速度頂多就跟大陸那堆做三四年android app的人一樣
再快也有限
別人花一個月做
我也差不多要花一個月做
縱使同樣的事情交給公司其他的人需要花半年
又如何?
同樣的事情我不會去找大陸優秀的大學生給他們三個月的時間做嗎?
光光人力成本就可以省掉至少原來的四分之三
何必沒事還自己動手開發

更何況台灣跟大陸真的沒得比
台灣的java人才90%沒能力做JNI層
大陸的java人才卻通通都有本事可以做JNI
JNI本身也真的沒啥太大的know how
可是台灣人往往就是想不懂這點

像我這種專門在搞know how的人
真的是不喜歡在沒know how的方面打轉
可是app還是要有人寫啊
所以我都養成一個習慣
盡可能不提供任何原始碼
因為寫app的人往往都習慣抄完之後就沒有後續

事實上我從我自己公司那些寫app的人所拿到的原始碼
看完都很感慨
如果不打掉重做
根本沒有太大的空間可以繼續發展
程式結構亂得很
往往為了修改而修改
完全沒有應該有的結構性
程式就跟在學校裏的學生交的作業沒兩樣
只是為了交作業而寫
試想
這種程度的原始碼
我還不如發包給研究生去寫



...<div class='locked'><em>瀏覽完整內容,請先 <a href='member.php?mod=register'>註冊</a> 或 <a href='javascript:;' onclick="lsSubmit()">登入會員</a></em></div>
頁: [1]