2014年11月19日水曜日

エラー;INSTALL_FAILED_DUPLICATE_PERMISSION

INSTALL_FAILED_DUPLICATE_PERMISSION

というエラーが出現

AndroidManifest.xmlはまったくいじっていないのに。。。


http://stackoverflow.com/questions/24757537/android-adb-update-google-play-services-failure

デバック中の アプリをアンインストールするとこのエラーが出なくなったとの報告があるので、自分も試したら解決!!

よくわからないけど、これは頻繁に起こるのか??

Eclipseから、Android Studioへ簡単移行

Eclipseの環境から、AndroidStudioに移行をしています。

gradleの書き換えとか、libの追加とかお手製で作業を行っていたのですが、eclipseでgradleでエクスポートできる事を知ったので、共有します。

Eclipse立ち上げ
移行したいプロジェクトのあるワークスペースを立ち上げ
右クリック
エクスポート


この画面で Generate Gradle build files
を選択

すると、Gradleでビルドされます。

AndroudStudioでimportすれば完了!!

簡単です。

2014年11月18日火曜日

エラー;ADB not responding.If you'd like to retry, then please manually kill "adb" and click 'Restart'

ADB not responding.If you'd like to retry, then please manually kill "adb" and click 'Restart'



このようなエラーがでました。

何かSDKの場所を変えたことが悪いっぽい。。。

Genymoutionを立ち上げて、SDKのパスを更新。




この場所はパスの変更を忘れていたことを思い出した。

これで、無事にビルドができて実行できました。

SDKのパスを変更する際には影響範囲にご注意

2014年11月14日金曜日

エラー;The Android SDK folder can no longer be inside the application folder. 〜〜〜〜 AndroidStudio アップデートしたら、エラーが出現

AndroidStudioがバージョンアップできたので、バージョンアップしたら、エラーがでました。

The Android SDK folder can no longer be inside the application folder.
Please move it to a different location such as your home folder.
When the IDE restarts it will prompt you to enter the new location.


英検4級なので翻訳できましたが、Android SDKフォルダの場所を変えてくれという、文句っぽいので、AndroidStudioの外のフォルダに移動したら、無事にアップデートできました。

アップデートして、適当にプロジェクトをオープンしたら、案の上
「SDKがない」
と怒られたので、SDKの場所を指定して、無事にプロジェクトをオープンできました。



2014年10月29日水曜日

高速エミュレーター(Genymotion)を導入。Androidのエミュレータ本当に遅い!!との決別

Android開発で本当に嫌気がさすことの一つにエミュレータの起動が遅い!!
そんな思いもうしたくないですよね??

そんな、あなたに今日オススメしたいのが

「Genymotion」

高速なエミュレータとして、Android開発者界隈では結構有名らしいです。

https://shop.genymotion.com/index.php?controller=order-opc

このページで
Freeのダウンロードを選びましょう

そうするとログインが求められるので、適当なemailアドレスとパスワードを準備して、
新規アカウントの作成。

アカウント作成して、再挑戦すると、




上のページで表示されるので、適時ダウンロードして、インストールしてください。


インストールして、開けました??

開けない方は
「virtualbox」
が必要な方なので、インストールしてください。

https://www.virtualbox.org



左側のDownloadを押すとダウンロードに進みます。
インストール完了して、再度Genymotionを開いて下さい。



こんな画面がでればインストール成功です。

Addボタンを押して、端末をインストールします。


お好みの端末を選んで、Nextボタンを押下
ログイン・パスワードが聞かれるので、入力したら追加されます。



追加した端末を選んで、Startを押すとエミュレータが起動します。

AndroidのIDEでプロジェクトを実行すると、


こんな感じで使えます。(できない人はプロジェクトの実行構成を確認してね。RunCinfig〜です。)




2014年9月25日木曜日

Eclipseから、Android Studioへ移行してみた

Eclipseから、Android Studioへ移行してみた

Android Studio

http://developer.android.com/sdk/installing/studio.html#download

ここから、ダウンロードできます。

特徴&感想
・ベースのIDEが『IntelliJ』
→『Eclipse』はIDEの名称です。IDEがわからない人は特に気にしなくても
・コード補完やリファクタリング機能が賢くなった。と感じる。
→リソースの紐付けも、ズレにくくなっていると感じます。。。。
・見た目がかっこいい!!
→Preferences→Appearance→ ThemeをDarculaにすると、なかなか
・Gitの管理が簡単!!
・Android SDK Managerの初回のインストールが不要!!
→落としてから、いきなり使えます!!(MAC *Windowsは環境パスの設定とかJDKが必要かも??)
・ログが見やすい。。
・ワークスペースがいらない!!
→ビルドツールと各プロジェクトのモジュールの管理方法が『Eclipse』と異なります。




まとめ
・使ってみると、ストレートにいい感じです。『Eclipse』でできていたことは大抵できるし、直感的に操作できるUIになっているかと思います。
今後はAndroidStudioで開発していこうと思います。

2014年3月17日月曜日

ListView -02 (リストの追加、スクロールの一番下を検知、スクロールが一番下になったら追加,行の高さの固定)

もっと自由にListViewを使う

わりと使うことが多いリストビュー。

わりと小さい機能だけど、たまに欲しくなる機能をまとめてみました。

ListViewはじめての方はこちらのページを確認してね。
http://androidgamepark.blogspot.jp/2013/09/listview-baseadapter.html


今日紹介するのはこちら、

1.リストの区切りの線を入れる。線の色を変える
2.リストの削除
3.一番下まで、スクロールしたら、リストに追加する
4.行の高さを固定したい

この3つの機能を紹介します。

1.の線の色に関しては、

ListView oListView   = new ListView( getApplicationContext() );
//行間の線色を指定
oListView.setDivider( new ColorDrawable( Color.RED ) );
//線の太さ
oListView.setDividerHeight( 2 );

setDividerを使えばOKです。色の指定はColorDrawableを使用して下さい。
また、線の太さを指定しないと線が出てないので、注意!!

2.のリストの削除に関しては、
ListAdapterの中身を削除して、
notifyDataSetChanged();
を呼べば大丈夫です。

3.も
ListAdapterの中身を追加して、
notifyDataSetChanged();
を呼べば大丈夫です。

ただ、一番下まで、スクロールしたかを拾うのに

ListView.setOnScrollListener( this );

をimplementsする必要があります。

4.はリストの高さを指定するだけです。

詳しくはサンプルソースを見てください。

サンプルソースは3ファイルから、構成されます。
MainActivity
ListAdapter
Adapterの中身クラス
の3ファイルです。

◇サンプルソース
■MainWebView

package com.example.ListView;

import android.app.Activity;
import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewGroup.LayoutParams;
import android.widget.AbsListView;
import android.widget.AbsListView.OnScrollListener;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.AdapterView.OnItemLongClickListener;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.Toast;


public class MainActivity extends Activity implements OnItemClickListener, OnScrollListener, OnItemLongClickListener{

    //レイアウトパラメータ
    private final int MP = ViewGroup.LayoutParams.MATCH_PARENT;
    //リスト情報を格納した配列
    private ListAdapter oAdp;
    //行の挿入が可能かのフラグ
    private boolean bChk = false;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        //レイアウトの生成
        LinearLayout oLayout = new LinearLayout( this );
        //レイアウトを画面に反映
        setContentView(oLayout);

        //リストビューの生成
        ListView oListView   = new ListView( this );
        //レイアウトパラムの設定
        oListView.setLayoutParams( new LayoutParams( MP,MP ) );
        //行間の線色を指定
        oListView.setDivider( new ColorDrawable( Color.RED ) );
        //線の太さ
        oListView.setDividerHeight( 2 );
        //リストをクリックした時の処理を設定
        oListView.setOnItemClickListener( this );
        //リストをスクロールした時の処理を設定
        oListView.setOnScrollListener( this );
        //リストを長押しした時の処理を設定
        oListView.setOnItemLongClickListener( this );

        //リストビューに入れるアイテムAdapterを生成
        oAdp = new ListAdapter( getApplicationContext() );
        //Adapterにアイテムを追加
        Add_DataList();
        //Adapteの中身を更新
        oAdp.notifyDataSetChanged();

        //リストビューにアイテムadapterを設定
        oListView.setAdapter( oAdp );
        //リストをレイアウトに追加
        oLayout.addView( oListView );
    }

    //アダプターにアイテムを追加
    private void Add_DataList(){
        for (int i = 0; i < 13; i ++){
            //配列にタイトルと画像を格納
            if ( i == 12 ){
           oAdp.Set_Datalist(new ListItem(String.valueOf("番号:" + i), "むかしむかしあるところにおじいさんとおばあさんがいました。おばあさんはかわにせんたくにおじいさんはやまにしばかりにいってました。FINISH!!", R.drawable.ic_launcher));
            }else{
           oAdp.Set_Datalist(new ListItem(String.valueOf("番号:" + i), "Hello, Goodbye, Hello Goodbye", R.drawable.ic_launcher));
            }
        }
    }

    @Override
    public void onItemClick(AdapterView parent, View view, int position, long id) {
        //クリックされた項目を取得
        ListItem oList = oAdp.getItem(position);
        //押された時のパラメーターを表示
        Toast.makeText(getApplicationContext(), "押下されたのは:" + oList.Get_Title(), Toast.LENGTH_SHORT).show();
    }

    @Override
    public void onScroll(AbsListView view, int iTop, int iVisible, int iTotal) {
        boolean bLast = iTotal == iTop + iVisible;
        //最終行であるかの確認
        if (bLast && bChk) {
            Add_DataList();
            oAdp.notifyDataSetChanged();
        }
    }


    @Override
    public void onScrollStateChanged(AbsListView view, int scrollState) {
        // スクロールの状態を検知する
        switch (scrollState) {
           // スクロールしていない
    case OnScrollListener.SCROLL_STATE_IDLE:
              // スクロール中であることを示すフラグをfalseに
              bChk = false;
              break;
    // スクロール中
          case OnScrollListener.SCROLL_STATE_TOUCH_SCROLL:
              bChk = true;
            break;
          // はじいたとき
          case OnScrollListener.SCROLL_STATE_FLING:
              break;
        }
    }

    @Override
    public boolean onItemLongClick(AdapterView parent, View view, int positon, long id) {
        //データリストを削除
        oAdp.Del_Datalist(positon);
        //Adapteの中身を更新
        oAdp.notifyDataSetChanged();
        return false;
    }
}


■ListItem
package com.example.ListView;

public class ListItem {


    private String sTitleText;
    private String sDetailText;
    private int    iResource;

    public ListItem(String sTitle, String sDetail, int iRes){
        //文字列を取得
    sTitleText     = sTitle;
        //画像のResIDを取得
        iResource      = iRes;
        //リスト内の詳細について
        sDetailText    = sDetail;
    }

    public String Get_Title(){

        //文字列を返す
        return sTitleText;
    }

    public String Get_Detail(){

        //文字列を返す
        return sDetailText;
    }

    public int Get_Resource(){

        //画像のResIDを返す
        return iResource;
    }
}


■ListAdapter

package com.example.ListView;

import java.util.ArrayList;

import java.util.List;

import android.content.Context;

import android.graphics.Color;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewGroup.LayoutParams;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;

public class ListAdapter extends BaseAdapter{

    //コンテキストを取得
    private Context mContext;
    //リスト情報を格納している配列
    private List<ListItem> dataList = new ArrayList<ListItem>();
    //レイアウトパラムの定数
    private final int MP = ViewGroup.LayoutParams.MATCH_PARENT;

    //コンストラクターで生成時に呼ばれる

    public ListAdapter(Context context){
        //生成時のコンストラクターでコンテクストを取得
        mContext = context;
    }

    @Override

    public int getCount() {
        //リストの行数
        return dataList.size();
    }

    @Override

    public ListItem getItem(int posion) {
        //配列の中身を返す
        return dataList.get(posion);
    }

    @Override

    public long getItemId(int posion) {
        //現在の配列の場所
        return posion;
    }

    @Override

    public View getView(int position, View view, ViewGroup parent) {

        View v = view;

        if( v == null ){
            //グリットビューの1マス内のレイアウトを作成
            LinearLayout oListLayout = new LinearLayout(mContext);
            //左から右にアイテムを追加
            oListLayout.setOrientation(LinearLayout.HORIZONTAL);

            LinearLayout oTextLayout = new LinearLayout(mContext);

            oTextLayout.setOrientation(LinearLayout.VERTICAL);

            //イメージビューを生成

            ImageView oImage = new ImageView(mContext);
            //テキストビューを生成
            TextView oTitle  = new TextView(mContext);
            TextView oDetail = new TextView(mContext);

            //文字大きさの指定

            oTitle.setTextSize(20);
            oDetail.setTextSize(15);

            //文字の色も指定

            oTitle.setTextColor(Color.BLACK);

            //判別用にタグをつける

            oImage.setTag("CellImage");
            oTitle.setTag("CellTitle");
            oDetail.setTag("CellDetail");

            //テキストレイアウトにビューを追加

            oTextLayout.addView(oTitle);
            oTextLayout.addView(oDetail);
            oTextLayout.setLayoutParams(new LayoutParams(MP, 120));
         
            //グリットビュー用のレイアウトに追加
            oListLayout.addView(oImage);
            oListLayout.addView(oTextLayout);
            v = oListLayout;
        }

        //配列から、アイテムを取得

        ListItem oList = getItem(position);
        if( dataList != null){
            //タグからテキストビューを取得
            TextView title = (TextView) v.findViewWithTag("CellTitle");
            //取得したテキストビューに文字列を設定
            title.setText(oList.Get_Title());

            //タグからテキストビューを取得

            TextView detail = (TextView) v.findViewWithTag("CellDetail");
            //取得したテキストビューに文字列を設定
  detail.setText(oList.Get_Detail());
       
  //タグからイメージビューを取得
            ImageView imag = (ImageView) v.findViewWithTag("CellImage");
            //イメージビューに画像を設定
            imag.setBackgroundResource( oList.Get_Resource() );
        }

        return v;

    }

    //データリストの追加

    public void Set_Datalist(ListItem oList){
        dataList.add(oList);
    }
 
    //データリストの削除
    public void Del_Datalist(int iPos){
        dataList.remove(iPos);
    }
}

■実行結果






こんな感じになります。

一番下までスクロールしたら、12行追加される。
行を長押ししたら、その行が削除される。

タッチイベントを拾って、数字がずれていないことを確認OK

注意点としては

implements OnItemClickListener, OnScrollListener, OnItemLongClickListener

implementsが複数あることを注意して下さい。

2014年2月20日木曜日

エラー (ADT のこのバージョンは Android SDK ツールの改訂 ~)This Android SDK requires Android Developer Toolkit version or above. Curre...version is Please update ADT to the latest version.


eclipseを立ち上げたら、こんなエラーがでた!!

ADTのバージョンが古いのかな??

SDKツールとか言っているので、




SDKマネージャーを立ち上げ

~22.3と書いてあったので、
Android SDK Toolsにチェックを入れて、インストール




eclipseを再起動したら、OK!!

ダイアログは出現しなくなりました!!


が、しかしBuildが上手くできない!!
R.~がエラーになる


Android SDK Build-toolsもインストールしなければダメぽ


2014年2月17日月曜日

ファイルの書き込み、生成(FileOutputStream, file:///data/data/)

ファイルの読み込みをやったので、今回はファイルの書き込みを。

//アウトプットストリームの生成
openFileOutput( ファイル名:String型, モード:int型)

こんな感じで使います。↓
FileOutputStream oOutStreame = openFileOutput( "test.htmk", MODE_PRIVATE );

モードの定数はこちら

MODE_WORLD_READABLE   他のアプリから参照可
MODE_WORLD_WRITEABLE  他のアプリから書き込み可
MODE_PRIVATE                他のアプリからアクセス不可
MODE_APPEND                  ファイルがあると、追記


また、モードを複数指定する場合には
パイプを繋げると複数指定できます。

MODE_PRIVATE | MODE_APPEND


また、ファイルの保存場所は

file:///data/data/" パッケージ名 + /files/ + 作成したファイル名

こちらになります。

SDカードに保存する方法に関しては、また今度


■サンプルソース
package com.example.filemgr;

import java.io.FileOutputStream;
import java.io.IOException;

import android.os.Bundle;
import android.app.Activity;
import android.webkit.WebView;
import android.widget.LinearLayout;

public class MainActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  //ファイル名
  String sFileName  = "test.html";
  //書き込み内容
  String sText      = "<font color=\"red\">Goodbye World!!</font>";
  try {
           //アウトプットストリームの生成
    FileOutputStream oOutStreame = openFileOutput(sFileName, MODE_PRIVATE | MODE_APPEND);
//アウトプットストリームに書き込み
  oOutStreame.write(sText.getBytes());
  } catch (IOException e) {
  // TODO 自動生成された catch ブロック
e.printStackTrace();
  }
  //WebViewの生成
        WebView oWebView = new WebView( getApplicationContext() );
  //ファイルの保存先はこちらだ↓    "file:///data/data/パッケージ名 + files + 作成したファイル名

        String sUrl = "file:///data/data/" + getPackageName() +"/files/" + sFileName;oWebView.loadUrl( sUrl );
      
  //レイアウトの生成とテキストの貼り付け
        LinearLayout oLayout = new LinearLayout(getApplicationContext());
        oLayout.addView(oWebView);
        //レイアウトを表示
        setContentView(oLayout);
  }
}

■実行結果



今回は拡張子をhtmlにしましたが基本的には、何でも大丈夫です。
注意点としては、ファイルを書き込む際にフルパスを指定しないことです。


2014年2月9日日曜日

ローカルファイルの読み込み(getAssets(), BufferedReader)

これの続きです。
前回は「assets」の配下に「test.html」を作成して、
そのファイルをhtmlとして、読み込みましたが、
今回は中のファイルに何が書かれているかを見たいと思います。

注意点としては、assets配下のファイルは読み込みはできるけど、
書き込みはできません。
もう一度言います。
assets配下のファイルは読み込み可、書き込み不可です。
自分は書き込みをしたくて、一週間くらい調べましたができませんでした。

できる方法もあるかもしれませんが。。。 
リファレンス的には読み込み専用となっています。

http://developer.android.com/reference/android/content/res/AssetManager.html


■サンプルソース
package com.example.filemgr;

import java.io.BufferedReader;

import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

import android.os.Bundle;
import android.app.Activity;
import android.widget.LinearLayout;
import android.widget.TextView;

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        //インプットストリームの作成
        InputStream oInStream;
        String lineBuffer;
        String str = "";
        try {
            //assetsに存在するtest.htmlを開くという命令
            oInStream = getAssets().open("test.html");
            //リーダーでインプットストリームの内容を読む
            BufferedReader reader= new BufferedReader(new InputStreamReader(oInStream,"UTF-8"));
            while( (lineBuffer = reader.readLine()) != null ){
                str = str + lineBuffer;
            }
        } catch (IOException e) {
            // TODO 自動生成された catch ブロック
            e.printStackTrace();
        }

        //テキストビューの作成
        TextView oTextView = new TextView(getApplicationContext());
        oTextView.setText(str);

        //レイアウトの生成とテキストの貼り付け
        LinearLayout oLayout = new LinearLayout(getApplicationContext());
        oLayout.addView(oTextView);

        //レイアウトを表示
        setContentView(oLayout);
    }
}


■実行結果


■実行結果

みづらいけど、
前回作成したファイルの中身が見れました。。。

//リーダーでインプットストリームの内容を読む
BufferedReader reader= new BufferedReader(new InputStreamReader(oInStream,"UTF-8"));
while( (lineBuffer = reader.readLine()) != null ){
    str = str + lineBuffer;
}
ここらへんの処理はAndroidではあんまり使いませんが、
JAVAではよく使う処理です。

oInStream = getAssets().open("test.html");

これがミソです。

getAssets()で、アセットフォルダを取得しています。(イメージとして)

なので、ファイル名の指定だけで開けます。
これはAndroid特有の処理です。


AndrdoiMainifest.xml-03 (ホーム画面とアイコン, android.intent.category.LAUNCHER)

あまり使う機会がないと思いますが、
android.intent.category.LAUNCHER
を複数のActivityに記述した時の挙動を紹介したいと思います。

一応

このページの続きなので、訳わからない人は上のリンクを参照してください。


用意するものは

複数のActivity
複数のicon

■サンプルソール
・メインのアクティビティ

package co.jp.test.manifest.xml;

import android.os.Bundle;
import android.app.Activity;
import android.widget.LinearLayout;
import android.widget.TextView;

public class MainActivity extends Activity {

  @Override
  protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);

  //テキストビューの生成
  TextView oTextView = new TextView(getApplicationContext());
  oTextView.setText("メイン画面");

  //LinearLayoutの生成
  LinearLayout oLayout = new LinearLayout(getApplicationContext());
  oLayout.addView(oTextView);
  setContentView(oLayout);
  }
}

・サブのアクティビティ
package co.jp.test.manifest.xml;

import android.os.Bundle;
import android.app.Activity;
import android.widget.LinearLayout;
import android.widget.TextView;

public class SubActivity extends Activity {

  @Override
  protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);

  //テキストビューの生成
  TextView oTextView = new TextView(getApplicationContext());
  oTextView.setText("サブ画面");

  //LinearLayoutの生成
  LinearLayout oLayout = new LinearLayout(getApplicationContext());
        Layout.addView(oTextView);
  setContentView(oLayout);
  }
}


・AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
  package="co.jp.test.manifest.xml"
  android:versionCode="1"
  android:versionName="1.0" >
  <uses-sdk
    android:minSdkVersion="8"
    android:targetSdkVersion="17" />

  <application
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:theme="@style/AppTheme" >
    <activity
      android:name="co.jp.test.manifest.xml.MainActivity"
      android:label="activityのラベル" >
      <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
      </intent-filter>
    </activity>
    <activity
      android:name="co.jp.test.manifest.xml.SubActivity"
      android:icon="@drawable/icon2"
      android:label="subactivityのラベル" >
      <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
      </intent-filter>
    </activity>
  </application>
</manifest>


■実行結果



こんな画面が立ち上がると思います。
端末のホーム画面を見ると
"activityのラベル"と書かれたアイコンが表示されています。



一番左下に存在するのが、subactivityです。
AndroidManifest.xmlで最後に記述したactivityです。

タッチすると



ちゃんとサブの方が表示されました。

1つのアプリで複数のアイコンをホーム画面に表示できました。


この機能を使う機会があるのかはわかりませんが。。。



2014年2月3日月曜日

ローカルのHTMLファイルを表示(ローカルファイル,file:///android_asset)

Webページではなくローカルのhtmlファイルを表示する方法を共有します。
iPhoneは規約のせいで、編集できないローカルにもたなければいけないファイルが
ありますが、Androidには特にありません。。

なので、あまり使う機会はないと思いますが、
ローカルでファイルを管理する時に必要だと思うので、覚えておいて損はないです。

■ローカルファイルの配置

【プロジェクト名で右クリック】→【新規】→【ソース・フォルダ】→assetsという名のフォルダ作成

■ローカルファイルの配置

適当なテキストエディタを開き

<html xmlns="http://www.w3.org/1999/xhtml" xml: lang="ja">
  <body>
    <p>Hello World!!</p>
  </body>
</html>

↑をコピって貼り付ける
「test.html」として保存


「test.html」をassetsフォルダにドラッグ

■サンプルソース

package com.example.filemgr;

import android.os.Bundle;
import android.app.Activity;
import android.webkit.WebView;

public class MainActivity extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

WebView oWebView = new WebView(getApplicationContext());
oWebView.loadUrl( "file:///android_asset/test.html" );
setContentView(oWebView);
}

}

■実行結果


こんな感じで完了です。


■おまけ


package com.example.filemgr;

import java.io.IOException;

import android.os.Bundle;
import android.app.Activity;
import android.webkit.WebView;

public class MainActivity extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

//assets直下のファイルを一覧で表示
String sMergeString = "";

try {
//assetsフォルダ直下に何があるかを表示
String[] sFileList = getAssets().list("");

//ファイル一覧を取得
for(String file : sFileList){
sMergeString = file + " ; " + sMergeString;
}

} catch (IOException e) {
// TODO 自動生成された catch ブロック
e.printStackTrace();
}

WebView oWebView = new WebView(getApplicationContext());
//文字列をhtml形式で出力する
oWebView.loadData(  sMergeString , "text/html", null);
setContentView(oWebView);
}
}

■実行結果



このソースは何??
→assetsフォルダの直下にあるファイル一覧を表示しています。

細かいソースの説明は省略しますが、
先ほど作成した、「test.html」
以外にもいくつかのファイルが存在することを確認できると思います。

まぁ、何を言いたいかというと、今回は「assets」直下にファイルを置きましたが、
ちゃんとしたものを作る際には、「assets」のしたにもう一階層作って、
そのフォルダ内にファイルを配置しましょう!!

AndrdoiMainifest.xml-02 (タイトルとホーム画面でのアプリ名の設定)

ホーム画面上のアプリ名の変更もAndroidManifest.xmlで
行います。



<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
  package="co.jp.test.manifest.xml"
  android:versionCode="1"
  android:versionName="1.0" >
  <uses-sdk
    android:minSdkVersion="8"
    android:targetSdkVersion="17" />

  <application
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="これがラベル値だ"
    android:theme="@style/AppTheme" >
    <activity
      android:name="co.jp.test.manifest.xml.MainActivity"
      android:label="activityのラベル" >
      <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
      </intent-filter>
    </activity>
  </application>
</manifest>

■実行結果





こんな実行結果になりました。
起動するActivtyのタイトルがホーム画面のアプリ名と一致することが、
上の2枚の画像から、わかると思います。

また、「設定画面」→「アプリケーション」の画面で確認できるのが
applicationタグで設定したラベル名となります。

ホーム画面のアプリ名と起動するActivityのラベル名を変更したいときはどうすればいいのでしょか??

教えて偉い人!!

2014年1月24日金曜日

エラー(APK は 'aapt dump badging' では解析できませんでした。エラー出力:)

Failed to run aapt dump badging:

 アップロードできませんでした

APK は 'aapt dump badging' では解析できませんでした。エラー出力:

Failed to run aapt dump badging:
ERROR getting 'name' attribute: attribute is not a string value


DeveloperConsoleにアプリをアップロードする際に上記のエラーがでました。
ググったのですが、全然解決方法がわかりませんでした。

Manifest.xmlの
パッケージ名の指定が間違っているところがあり、
こんなエラーがでていたようです。

ちゃんと、指定したら問題ありませんでした。
逆に何で今まで動いてたんだろう??

2014年1月6日月曜日

エラー where item tag is expected

xmlファイルの編集中に

縲��" where item tag is expected

こんなエラーがでて、はまった。

調べてもよくわからなったが、何か英語のサイトによると
スペースを消すといいらしい。

コピった部分のスペースを消したら、
エラーが出なくなった。