FC2ブログ

更新履歴Blog

日記

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

HOMEアプリを作成する

起動時、ホームボタンを押した時に起動するアプリの作成手順。
マニフェストを少し修正するだけで、アプリをホームアプリにできる。

デフォルト(AndroidManifest.xml)
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

ホームアプリ(AndroidManifest.xml)
        </activity android:name=".MainActivity">
            </intent-filter>
                </action android:name="android.intent.action.MAIN" />

                </category android:name="android.intent.category.DEFAULT" />
                </category android:name="android.intent.category.HOME" />
            <//intent-filter>
        <//activity>

インストールしてもホームボタンを押さないと起動しない。
デフォルトでhomeアプリはインストールされているので、ホームボタンを押した時にランチャーから起動ができる。

201606071603.png
常時に設定してしまうと、常に表示される状態になってしまう為、この場合はadbでコマンドからアンインストールするとよい。
スポンサーサイト

AndroidStdioのインストール

WindowsにAndroidStdioをインストールする手順

  1. AndroidStdioのサイトからAndroidStdioをダウンロードする

    201604271342.png

  2. ダウンロードした「android-studio-bundle-XXX.XXXXXXX-windows.exe」を実行する
    Welcome to Android Stdio Setupの画面が起動するので「Next >」をクリック

    201604271350.png

  3. Java Development Kit バージョン7(JDK7)がインストールされている場合は、12の画面へ遷移する
    インストールされていない(もしくはシステムが認識できていない)場合、インストールするようにメッセージがでるので、jdk-7uXX-windows-x64.exeのリンクをクリック(ブラウザが起動する)してJava Development Kit バージョン7(JDK7)のダウンロードページへ行きます。

    201604271355.png

  4. Windows x64の「jdk-7uXX-windows-X64.exe」をクリックしてダウンロードする
    ※32bit版のWindowsを利用している場合はWindows x86の「jdk-7uXX-windows-i586.exe」をダウンロードする
    ダウンロードする前に上にあるラジオボタンの「Accept License Agreement」を選択しておかないとダウンロードできない。
    またダウンロードにはOracleのアカウント取得(無料)が必要なので登録をする。
    アカウントの登録にはメールアドレスが必要

    201604271418.png

  5. ダウンロードしたJDK「jdk-7uXX-windows-x64.exe」を実行。
    「次」をクリック

    201604271724.png

  6. Javaをインストールするフォルダを指定する画面へ遷移
    特に変更する必要がなければ「次」をクリック

    201604271743.png

  7. 処理が始まるのでしばらく待つ

    201604271747.png

  8. インストール先の指定画面
    特になければそのまま「次」をクリック

    201604271750.png

  9. セットアップ処理が始まるのでしばらく待ち

    201604271753.png

  10. 完了画面になったら「閉じる」をクリックしてAndroid Stdioのセットアップに戻る

    201604271755.png

  11. イントールしたJDKのパスを指定して「Next」を押す
    進まない場合、一度Windowsを再起動する
    再起動するとJavaのパスが正しく通るので、AndroidStdioのインストールを再開すると次の画面へ進んだところから再開する

    201604271355.png

  12. インストールしたいものを選択する画面
    特に問題なければ「Next」をクリック

    201604271839.png

  13. 同意の画面が出るので「I Agree」をクリックする

    201604271846.png

  14. AndroidStdioとAndroidSDKをインストールするパスの指定
    問題なければ「Next」で進む

    201604271850.png

  15. スタートメニューに登録する設定
    問題なければ「Install」をクリック

    201604271853.png

  16. インストールが開始されるので、しばらく待ち

    201604271857.png

  17. 完了したら「Next」をクリック

    201604271913.png

  18. 「Finsh」をクリックでインストール完了

    201604271916.png

  19. AndroidStdioを起動するとComplete Installationのダイアログが起動する。

    古いバージョンのAndroidStdioがインストールされている場合、設定を引き継ぐ事ができるので引き継ぎたい場合は「I want to import my settings from a custom location」を選択

    古いバージョンのAndroidStdioはインストールされていない、又は設定ファイルの引き継ぎが必要ない場合は「I do not have a previous version of Stdio or I do not want to import my settings」を選択

    「OK」をクリックするとAndroidStdioが起動する

    201604271920.png

  20. Welcomeの画面へ遷移
    「Next」をクリックして進む

    201604271933.png

  21. Install Typeの画面へ遷移
    Standardを選択した状態で「Next」をクリック

    201604271935.png

  22. Verify Settingsの画面へ遷移
    AndroidSDKの保存先のパスと容量の情報が表示されている
    「Finish」をクリック

    201604281032.png

  23. Downloading Componentsの画面へ遷移
    ダウンロードが始まるので終了するまで待ち
    ダウンロードが終わると「Finish」のボタンが有効になるのでクリック

    201604281037.png
  24. インストール完了

    201604281056.png

ログイン試行をブロックしました。

アンドロイドアプリでメール送信を行うコードを書いたら、GMailのアカウント認証でブロックされました。
GMailのアカウントにメール「ログイン試行をブロックしました」というタイトルのメールが飛んできます。


2016041318.png

Googleのアカウント情報にあるログインとセキュリティに「安全性の低いアプリの許可」の設定があり、デフォルトではオフになっているので、これをオンに変更すると、とりあえずメール送信が可能になりました。

201604130022.png

Gmailアカウントでメール送信をする

AndroidアプリでGMailアカウントを使ってメール送信をするやり方

  1. GMailのアカウントを持っていない場合は、GoogleのサイトからGMailのアカウントを取得する。

  2. マニフェスト(AndroidManifest.xml)にインターネット接続を許可するパーミッションを追加する
        <uses-permission android:name="android.permission.INTERNET">
    

  3. 以下3つのjarをJavaMail-Androidのサイトからダウンロードして入手する
    ・activation.jar
    ・additionnal.jar
    ・mail.jar

  4. ダウンロードした「activation.jar」「additionnal.jar」「mail.jar」をプロジェクトのlibsフォルダに配置する
    201604121439.png
    Windowsはエクスプローラで、MacならFinderで直接コピーでOK

  5. build.gladleを編集して「activation.jar」「additionnal.jar」「mail.jar」を読み込む
    dependencies {
        compile fileTree(dir: 'libs', include: ['*.jar'])
        testCompile 'junit:junit:4.12'
        compile 'com.android.support:appcompat-v7:23.2.0'
        compile 'com.android.support:design:23.2.0'
        compile files('libs/activation.jar')
        compile files('libs/additionnal.jar')
        compile files('libs/mail.jar')
    }
    

  6. メール送信のコードをかく

以下、ソースコード
Android.manifest
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.app">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name"
            android:theme="@style/AppTheme.NoActionBar">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

    <uses-permission android:name="android.permission.INTERNET"></uses-permission>

</manifest>
MainActivity.java
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;

public class MainActivity extends AppCompatActivity {

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

        SendMailAsyncTask task = new SendMailAsyncTask();
        task.execute();
    }
}
SendMailAsyncTask
package com.example.app;

import android.os.AsyncTask;
import android.util.Log;

import java.util.Date;
import java.util.Properties;

import javax.mail.AuthenticationFailedException;
import javax.mail.Authenticator;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;

public class SendMailAsyncTask extends AsyncTask {

    private String gmailAddress = "exsample@gmail.com";    //  取得したGMailのアドレス
    private String gmailPassword = "password";    //  取得したGMailのアカウント
    private String encodeType = "UTF-8";

    @Override
    protected Integer doInBackground( String... paramas )
    {
        String subject = "メールタイトル";
        String message = "メール本文";

        //  SSL
        Properties props = new Properties();
//      props.put("mail.debug", "true");
//      props.put("mail.debug.auth", "true");
        props.put("mail.transport.protocol", "smtp");
        props.put("mail.smtp.host", "smtp.gmail.com");
        props.put("mail.smtp.port", "465");
        props.put("mail.smtp.auth", "true");
        props.put("mail.smtp.quitwait", "false");
        props.put("mail.smtp.socketFactory.port", "465");
        props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
        props.put("mail.smtp.socketFactory.fallback", "false");
        props.put("mail.smtp.connectiontimeout", 30000);
        props.put("mail.smtp.timeout", 30000);


        try {
            Session session = Session.getInstance(props, new Authenticator() {

                @Override
                protected PasswordAuthentication getPasswordAuthentication() {
                    return new PasswordAuthentication( gmailAddress, gmailPassword );
                }
            });
//          session.setDebug(true);


            MimeMessage msg = new MimeMessage( session );
            msg.setHeader("Content-Type", "text/html");
            msg.setSentDate(new Date());
            msg.setSubject(subject, encodeType);
            msg.setFrom(new InternetAddress(gmailAddress, "差出人氏名", encodeType));

            //  送信先アドレスの配列
            String[] toMailAddress = {
                    "xxxxxx@gmail.com",
            };

            InternetAddress[] addresses = new InternetAddress[toMailAddress.length];
            for( int i=0;i<toMailAddress.length;i++ )
                addresses[i] = new InternetAddress( toMailAddress[i]);
            msg.setRecipients(Message.RecipientType.TO, addresses);
            msg.setText(message, encodeType, "plain");

            Transport.send( msg );
        }
        catch ( AuthenticationFailedException ex )
        {

        }
        catch( MessagingException ex )
        {

        }
        catch ( Exception ex )
        {

        }

        return 0;
    }
}


文字列が入っているか調べる

指定の変数に文字列が入っているか調べる便利なやり方
nullや入力なし(0-length)も判定できる

以下サンプルコード
String text;

if( TextUtils.isEmpty( text ))
{
    //  文字列が入っている場合はこっちを通る
}
else
{
    //  文字列が入っていない場合( text=="" または text==null の場合 )はこっちを通る
}

フラグメントを利用してダイアログを生成する

フラグメントを利用してDialogを生成する時の注意点。
FragmentActivityとDialogFragmentはimportするモノが事なっていて、どハマりしてしてしまった。

MainActivity
package com.example.app;

import android.os.Bundle;
import android.support.v4.app.FragmentActivity;     //  OK
import android.support.v4.app.FragmentManager;      //  OK
//import android.app.FragmentManager;               //  NG
import android.view.View;
import android.widget.Button;

public class MainActivity extends FragmentActivity {

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

        Button button1 = (Button)findViewById( R.id.button1 );
        button1.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {

                MyDialogFragment fragment = new MyDialogFragment();
                FragmentManager fm = getSupportFragmentManager();
                fragment.show( getSupportFragmentManager(), "dialog");
            }
        });
    }
}

MyDialogFragment.java
package com.example.app;

import android.app.AlertDialog;
import android.app.Dialog;
import android.support.v4.app.DialogFragment;   //  OK
//import android.app.DialogFragment;            //  NG
import android.content.DialogInterface;
import android.os.Bundle;

/**
 * Created by tornado on 16/04/04.
 */
public class MyDialogFragment extends DialogFragment {

    @Override
    public Dialog onCreateDialog( Bundle saedInstanceState )
    {
        AlertDialog.Builder builder = new AlertDialog.Builder( getActivity() );
        builder.setTitle("DialogFragment");
        builder.setMessage("フラグメントダイアログ");
        builder.setPositiveButton("OK", new DialogInterface.OnClickListener(){

            @Override
            public void onClick( DialogInterface dialog, int which )
            {
                dismiss();
            }
        });

        return builder.create();
    }
}

AndroidStdioでjavamailandroid.jarを読み込む手順

Androidでメール送信をやってみよう思い、javamailandroid.jarを使うやり方にたどり着いたが、AndroidStdioに組み込む手順がなかなかわからなかった。

以下がやった手順
  1. エクスプローラ(MacならFinder)でプロジェクトのファイルにあるlibsフォルダに直接AndroidStdioをコピー

    201604111028.png

  2. build.gladleを編集してjavamailandroid.jarを読み込む
    dependencies {
        compile fileTree(dir: 'libs', include: ['*.jar'])
        compile files('libs/javamailandroid.jar')
    }
    

javamailandroid.jarを読み込めていないと「MessagingException」などが使えない為、エラーになる。

Android起動時に起動するアプリケーション

Android起動時に起動するアプリケーションを作成する方法

  1. アンドロイドのマニフェスト(AndroidManifest.xml)にandroid.permission.RECEIVE_BOOT_COMPLETEDのパーミッションを追加。
    これを指定すると端末起動時にブロードキャストレシーバでRECEIVE_BOOT_COMPLETEDを受け取れるらしいです。
        <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED">
    

  2. ブロードキャストレシーバでRECEIVE_BOOT_COMPLETEDを受け取れるようにアンドロイドのマニフェスト(AndroidManifest.xml)を編集する
    
            <receiver android:name="[ブロードキャストレシーバ継承のクラス名]" android:permission="android.permission.RECEIVE_BOOT_COMPLETED">
                <intent-filter>
                    <action android:name="android.intent.action.BOOT_COMPLETED"/>
                    <category android:name="android.intent.category.DEFAULT" />
                </intent-filter>
            </receiver>
    

  3. ブロードキャストレシーバ継承クラスを新規作成して、RECEIVE_BOOT_COMPLETEDを受け取り、ここでメインのActivityを起動(アプリケーションを起動)させる
        public class MyReceiver extends BroadcastReceiver {
    
            public void onReceive(Context context, Intent intent) {
                Intent i = new Intent(context, [メインのアクティビティ名].class);
                i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                context.startActivity(i);
            }
        }
    
    


以下、全ソースコード
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.bootautorun">

    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name"
            android:theme="@style/AppTheme.NoActionBar">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <receiver android:name="MyReceiver" android:permission="android.permission.RECEIVE_BOOT_COMPLETED">
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED"/>
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </receiver>
    </application>
</manifest>

MyReceiver.java
package com.example.bootautorun;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;

public class MyReceiver extends BroadcastReceiver {

    public void onReceive(Context context, Intent intent) {
        Intent i = new Intent(context, MainActivity.class);
        i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        context.startActivity(i);
    }
}

FC2Ad

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。