2019年6月22日土曜日

JavaMail メモリ上のBitmapオブジェクトのメール添付

2019 Jun. 22.



// BitmapクラスbitmapInstanceをバイト配列byteArrayImageに変換する
ByteArrayOutputStream outStream = new ByteArrayOutputStream();
bitmapInstance.compress(Bitmap.CompressFormat.JPEG, 80, outStream);
byte[] byteArrayImage = outStream.toByteArray();

// byteArrayImageをメールに添付にする
final MimeBodyPart filePart = new MimeBodyPart();
filePart.setDataHandler(new DataHandler( new ByteArrayDataSource(byteArrayImage, "image/jpeg")));
String fileName = "FILE_NAME";
try {
    filePart.setFileName(MimeUtility.encodeWord(fileName));
} catch (UnsupportedEncodingException e) {
    e.printStackTrace();
}

2019年6月8日土曜日

2019年5月30日木曜日

android開発 シンプルなダイアログ表示

2019 Jun. 30.
2019 Jun. 29.
2019 Jun. 22.
2019 May 31.
2019 May 30.

参照元
https://developer.android.com/guide/topics/ui/dialogs
https://akira-watson.com/android/alertdialog.html
http://furudate.hatenablog.com/entry/2014/01/09/162421

[MainActivity]
package YOUR.PACKAGE.alertdialogsample;

import android.app.AlertDialog;
import android.app.Dialog;
import android.content.DialogInterface;
import android.support.annotation.NonNull;
import android.support.v4.app.DialogFragment;
import android.support.v4.app.FragmentManager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;


public class MainActivity extends AppCompatActivity {

    Button button_dialog1, button_dialog2, button_dialog3;
    private TextView text_view;
    private FragmentManager flagmentManager;

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

        text_view = findViewById(R.id.text_view);
        button_dialog1 = findViewById(R.id.button_dialog1);
        button_dialog2 = findViewById(R.id.button_dialog2);
        button_dialog3 = findViewById(R.id.button_dialog3);


        // button_dialog1ボタンタップでAlertを表示させる
        button_dialog1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                flagmentManager = getSupportFragmentManager();

                // DialogFragment を継承したAlertDialogFragment1のインスタンス
                AlertDialogFragment1 dialogFragment = AlertDialogFragment1.newInstance(100);
                // DialogFragmentの表示
                dialogFragment.show(flagmentManager, "test alert dialog1");
            }
        });


        // button_dialog2ボタンタップでダイアログのメッセージを変えたAlertを表示させる
        //   newInstance()への引数を変更してメッセージを変える
        button_dialog2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                flagmentManager = getSupportFragmentManager();

                // DialogFragmentを継承したAlertDialogFragment2のインスタンス
                AlertDialogFragment1 dialogFragment = AlertDialogFragment1.newInstance(200);
                // DialogFragmentの表示
                dialogFragment.show(flagmentManager, "test alert dialog2");
            }
        });


        // button_dialog3ボタンタップでItemを選択するAlertを表示させる
        button_dialog3.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                flagmentManager = getSupportFragmentManager();

                // DialogFragment を継承したAlertDialogFragmentのインスタンス
                AlertDialogFragment2 dialogFragment = new AlertDialogFragment2();
                // DialogFragmentの表示
                dialogFragment.show(flagmentManager, "test alert dialog");
            }
        });
    }


    public void setTextView(String message){
        text_view.setText(message);
    }


    /*
     * DialogFragmentを継承したクラスAlertDialogFragment1
     */
    public static class AlertDialogFragment1 extends DialogFragment {

        /*
         * コンストラクタを記述してはならない。
         * newInstance()でのsetArguments、onCreateDialog()でのgetArgumentsを利用する。
         */
        public static AlertDialogFragment1 newInstance( int requestCode) {
            AlertDialogFragment1 fragment = new AlertDialogFragment1();

            Bundle arguments = new Bundle();
            arguments.putInt("reqCode", requestCode);
            fragment.setArguments(arguments);

            return fragment;
        }

        @Override
        @NonNull
        public Dialog onCreateDialog(Bundle savedInstanceState) {

            int requestCode = getArguments().getInt("reqCode");

            AlertDialog.Builder alert = new AlertDialog.Builder(getActivity());

            switch (requestCode) {
                case 100:
                    alert.setTitle("Test AlertDialog1");
                    alert.setMessage("Message is 100");
                    break;

                case 200:
                    alert.setTitle("Test AlertDialog2");
                    alert.setMessage("Message is 200");
                    break;

            }
            alert.setPositiveButton(R.string.dialog_ok, null);

            return alert.create();
        }
    }


    /*
     * DialogFragmentを継承したクラスAlertDialogFragment2
     */
    public static class AlertDialogFragment2 extends DialogFragment {
        // 選択肢のリスト
        private String[] menulist = {"選択(1)","選択(2)","選択(3)"};

        @Override
        @NonNull
        public Dialog onCreateDialog(Bundle savedInstanceState) {

            AlertDialog.Builder alert = new AlertDialog.Builder(getActivity());

            alert.setTitle("Test AlertDialog3");
            alert.setItems(menulist, new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int idx) {
                    // 選択1
                    if (idx == 0) {
                        setMassage(menulist[0]);
                    }
                    // 選択2
                    else if (idx == 1) {
                        setMassage(menulist[1]);
                    }
                    // 選択3, idx == 2
                    else{
                        setMassage(menulist[2]);
                    }
                }
            });
            return alert.create();
        }


        private void setMassage(String message) {
            MainActivity mainActivity = (MainActivity) getActivity();
            if (mainActivity != null) {
                mainActivity.setTextView(message);
            }
        }
    }
}

2019年5月26日日曜日

android開発  端末の外部ストレージ内のファイルに対しファイル名部分一致検索

2019 May 26.




package YOUR.PACKAGE.APPLICATION;

/*
 * Re-use of https://akira-watson.com/android/file_search.html
 */

import android.os.Environment;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

public class SearchExternalStorageFile {

    // 外部ストレージ内のfileStrにマッチするファイルを検索
    public String[] searchFiles( String fileStr ){

        // マッチしたファイルの絶対パスを格納する
        List listMatchedFiles = new ArrayList<>();

        // String 型の ArrayList を生成
        List listDirectory = new ArrayList<>();

        // 外部ストレージのパスを取得する、パスは機種によって異なる
        File file = Environment.getExternalStorageDirectory();
        String storagePath = file.getPath();

        listDirectory.add(storagePath);

        int m = 0;
        int n = 0;
        String[] fileNames;
        String imgPath = null, fName;

        while(listDirectory.size() > m){

            File directory = new File(listDirectory.get(m));
            fileNames = directory.list();

            n = 0;
            while(fileNames.length > n){

                File subFile;
                subFile = new File(directory.getPath() + "/" + fileNames[n]);

                if (subFile.isDirectory()) {
                    listDirectory.add(directory.getPath() + "/" + fileNames[n]);

                } else {
                    if (fileNames[n].contains(fileStr)) {
                        listMatchedFiles.add(directory.getPath() + "/" + fileNames[n]);
                    }
                }
                n++;
            }
            m++;
        }
        int listSize = listMatchedFiles.size();
        return listMatchedFiles.toArray(new String[listSize]);
    }
}

java 時間フォーマット

2019 May 26.

Java で 24時間表記の場合の時間は kk とする。
 例 DateFormat.format("yyyy-MM-dd_kk:mm:ss", dateTaken).toString()

2019年5月25日土曜日

android開発 カメラ起動・写真撮影

2019 May 25.

"AndroidManifest.xml"
 <?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="YOUR.PACKAGE.sampletakephotogetimagefile">
    <uses-feature android:name="android.hardware.camera" />
    <uses-permission android:name="android.permission.CAMERA" />
    <uses-permission android:name="android.hardware.camera.autofocus" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>




package YOUR.PACKAGE.sampletakephotogetimagefile;
import android.Manifest;
import android.annotation.TargetApi;
import android.content.ContentResolver;
import android.content.ContentValues;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.database.Cursor;
import android.net.Uri;
import android.os.Build;
import android.provider.MediaStore;
import android.support.annotation.NonNull;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.text.format.DateFormat;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

    Button button_take_photo;
    ImageView image_view;
    TextView text_view_uri_path, text_view_file_path, text_view_image_title;
    static final int REQUEST_CAPTURE_IMAGE = 100;
    private final int REQUEST_PERMISSION__EX_STORAGE = 1000;
    private final int REQUEST_PERMISSION_CAMERA = 1010;

    Uri pictureUri;

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

        findViews();

        // check & get permissions
        if(Build.VERSION.SDK_INT >= 23){
            checkPermission();
        }
        if (checkSelfPermission(Manifest.permission.CAMERA) !=
                PackageManager.PERMISSION_GRANTED){
            button_take_photo.setText(R.string.button_unable_phote );
            button_take_photo.setEnabled(false);
        }

        setListeners();
    }


    protected void findViews(){
        button_take_photo = findViewById(R.id.button_take_photo);
        image_view = findViewById(R.id.imageView);
        text_view_uri_path = findViewById(R.id.textViewUriPath);
        text_view_file_path = findViewById(R.id.textViewFilePath);
        text_view_image_title = findViewById(R.id.textViewImageTitle);
    }


    // Permissionの確認
    //   from https://akira-watson.com/android/mediastore.html
    @TargetApi(Build.VERSION_CODES.M)
    public void checkPermission() {
        if (checkSelfPermission(Manifest.permission.CAMERA) !=
                PackageManager.PERMISSION_GRANTED){
            requestCameraPermission();
        }
        if (checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) !=
                PackageManager.PERMISSION_GRANTED){
            requestExStoragePermission();
        }
    }


    // CameraPermission許可を求める
    @TargetApi(Build.VERSION_CODES.M)
    private void requestCameraPermission() {
        if (shouldShowRequestPermissionRationale( Manifest.permission.CAMERA)) {
            requestPermissions(new String[]{Manifest.permission.CAMERA}, REQUEST_PERMISSION_CAMERA);

        } else {
            Toast toast = Toast.makeText(this, "許可されないとアプリが実行できません",
                    Toast.LENGTH_SHORT);
            toast.show();
            requestPermissions(new String[]{Manifest.permission.CAMERA }, REQUEST_PERMISSION_CAMERA);
        }
    }


    // ExternalStoragePermission許可を求める
    @TargetApi(Build.VERSION_CODES.M)
    private void requestExStoragePermission() {
        if (shouldShowRequestPermissionRationale( Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
            requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
                    REQUEST_PERMISSION__EX_STORAGE);

        } else {
            Toast toast = Toast.makeText(this, "許可されないとアプリが実行できません",
                    Toast.LENGTH_SHORT);
            toast.show();
            requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE },
                    REQUEST_PERMISSION__EX_STORAGE);
        }
    }


    // requestPermission結果に対する処理
    @Override
    public void onRequestPermissionsResult( int requestCode, @NonNull String[] permissions,
                                            @NonNull int[] grantResults) {
        if (requestCode == REQUEST_PERMISSION_CAMERA) {
            if (grantResults[0] != PackageManager.PERMISSION_GRANTED) {
                // 拒否された時の対応
                Toast toast = Toast.makeText(this, "これ以上なにもできません",
                        Toast.LENGTH_SHORT);
                toast.show();
            }
        } else if (requestCode == REQUEST_PERMISSION__EX_STORAGE) {
            if (grantResults[0] != PackageManager.PERMISSION_GRANTED) {
                // 拒否された時の対応
                Toast toast = Toast.makeText(this, "これ以上なにもできません",
                        Toast.LENGTH_SHORT);
                toast.show();
            }
        } else {
            Toast toast = Toast.makeText(this,
                    "Bad requestCode", Toast.LENGTH_SHORT);
            toast.show();
        }
    }


    protected void setListeners(){
        // カメラ起動ボタンが押された時
         button_take_photo.setOnClickListener(new View.OnClickListener() {

             @Override
             public void onClick(View v) {
                /*
                写真用情報を収集し、ContentResolverを使ってandroidに備わっている
                MediaStore.Images.Mediaデータベースに写真用情報を追加し、そのURI
                を取得する
                */
                long dateTaken = System.currentTimeMillis();
                String filename = DateFormat.format("yyyy-MM-dd_kk:mm:ss", dateTaken).toString() + ".jpg";
                ContentResolver contentResolver = getContentResolver();
                ContentValues values = new ContentValues(5);
                values.put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg");
                values.put(MediaStore.Images.Media.DATE_MODIFIED, System.currentTimeMillis()/1000);
                values.put(MediaStore.Images.Media.TITLE, filename);
                values.put(MediaStore.Images.Media.DISPLAY_NAME, filename);
                values.put(MediaStore.Images.Media.DATE_TAKEN,System.currentTimeMillis());
                pictureUri = contentResolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);

                // カメラを起動する
                Intent intent = new Intent();
                intent.setAction("android.media.action.IMAGE_CAPTURE");
                intent.putExtra(MediaStore.EXTRA_OUTPUT, pictureUri);
                  // MediaStore.EXTRA_OUTPUTで指定したpictureUriに、撮影後に画像データが書き込まれる
                startActivityForResult(intent, REQUEST_CAPTURE_IMAGE);
             }
         });
    }


    // このアクティビティから起動された他の機能から戻ってきた時の処理
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data ) {

        /*
          正しい結果が得られなかった場合の処理
          撮影キャンセルなどするとこっちに来る
        */
        if (resultCode != RESULT_OK) {

            // カメラ撮影からの復帰の時
            if (requestCode == REQUEST_CAPTURE_IMAGE) {
                Toast toast = Toast.makeText(this,"resultCode != RESULT_OK",
                        Toast.LENGTH_LONG);
                toast.show();
                return;
            }
        }

        /*
         * 写真撮影できた場合
         */
        if (requestCode == REQUEST_CAPTURE_IMAGE) {
            if (data == null ) {
                Toast.makeText(this, "data == null ",
                        Toast.LENGTH_SHORT).show();

            } else if ( data.getData() == null) {
                Toast.makeText(this, "data.getData() == null",Toast.LENGTH_SHORT).show();
            }

            // 撮影した写真を取り出す
            image_view.setImageURI(pictureUri);
            text_view_uri_path.setText("Uri path: " + pictureUri.getPath());

            // get filepath & title from uri
            ContentResolver contentResolver = this.getContentResolver();
            String[] columns =
                {
                    MediaStore.Images.Media.DATA,
                    MediaStore.Images.Media.TITLE
                };
            Cursor cursor = contentResolver.query(pictureUri, columns, null,
                    null, null);
            if(cursor == null) return;
            int pathIndex = cursor.getColumnIndex( MediaStore.Images.Media.DATA);
            int titleIndex = cursor.getColumnIndex( MediaStore.Images.Media.TITLE);
            cursor.moveToFirst();
            String filePath  = cursor.getString(pathIndex);
            String imageTitle = cursor.getString(titleIndex);

            text_view_file_path.setText(filePath);
            text_view_image_title.setText(imageTitle);

            return;
        }
    }
}

android開発 permission取得

2019 May 25.

"AndroidManifest.xml"
 <?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="xxx.xxx.sampletakephotogetimagefile">
    <uses-feature android:name="android.hardware.camera" />
    <uses-permission android:name="android.permission.CAMERA" />
    <uses-permission android:name="android.hardware.camera.autofocus" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>



if(Build.VERSION.SDK_INT >= 23){
            checkPermission();
}
PROCESS_AFTER_GETTING_PERMISSIONS


// Permissionの確認
//   reuse of https://akira-watson.com/android/mediastore.html
@TargetApi(Build.VERSION_CODES.M)
public void checkPermission() {
    if (checkSelfPermission(Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED){
        requestCameraPermission();
    }
    if (checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED){
        requestExStoragePermission();
    }
}

// CameraPermission許可を求める
@TargetApi(Build.VERSION_CODES.M)
private void requestCameraPermission() {
    if (shouldShowRequestPermissionRationale( Manifest.permission.CAMERA)) {
        requestPermissions(new String[]{Manifest.permission.CAMERA}, REQUEST_PERMISSION_CAMERA);

    } else {
        Toast toast = Toast.makeText(this, "許可されないとアプリが実行できません", Toast.LENGTH_SHORT);
        toast.show();
        requestPermissions(new String[]{Manifest.permission.CAMERA }, REQUEST_PERMISSION_CAMERA);
    }
}

// ExternalStoragePermission許可を求める
@TargetApi(Build.VERSION_CODES.M)
private void requestExStoragePermission() {
    if (shouldShowRequestPermissionRationale( Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
        requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_PERMISSION__EX_STORAGE);

    } else {
        Toast toast = Toast.makeText(this, "許可されないとアプリが実行できません", Toast.LENGTH_SHORT);
        toast.show();
        requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE }, REQUEST_PERMISSION__EX_STORAGE);
    }
}


// requestPermission結果に対する処理
@Override
public void onRequestPermissionsResult( int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    if (requestCode == REQUEST_PERMISSION_CAMERA) {
        if (grantResults[0] != PackageManager.PERMISSION_GRANTED) {
            // 拒否された時の対応
            Toast toast = Toast.makeText(this, "これ以上なにもできません", Toast.LENGTH_SHORT);
            toast.show();
        }
    } else if (requestCode == REQUEST_PERMISSION__EX_STORAGE) {
        if (grantResults[0] != PackageManager.PERMISSION_GRANTED) {
            // 拒否された時の対応
            Toast toast = Toast.makeText(this, "これ以上なにもできません", Toast.LENGTH_SHORT);
            toast.show();
        }
    } else {
        Toast toast = Toast.makeText(this, "Bad requestCode", Toast.LENGTH_SHORT);
        toast.show();
    }
}