ラベル Android の投稿を表示しています。 すべての投稿を表示
ラベル Android の投稿を表示しています。 すべての投稿を表示

2014年9月7日日曜日

Androidのメモリ アロケート量

知らないことが多いんだな-、と反省。

Dalvik VMはメモリサイズ量の管理が特殊なのかな。大容量をAllocateできない。JNI内でAllocateすると大量のメモリを確保できる。プロセスが終われば解放されるのであれば、それで良いのではないかと思う。

DalvikVM(JVM)は一定量以下のJAVAで利用するメモリを操作するのに向いていて、GCも効率よく出来ているようだが、メガバイト単位の領域を確保するようにはなっていないようだ。メガバイトを確保すると、他のアプリに迷惑がかかるだろうが、業務で利用することを考えたら、そんなことは関係無い。速く動く方が良いに決まっているし、機種も限定される。

JNIはVMの外側でアロケートできるようで、VMが管理している全メモリ量くらいまでアロケート可能なようだ。VMはBitmapをこの外部メモリにアロケートするようだが、Bitmap以外でもアロケートして欲しいものだ。

しかし、Javaの処理速度から考えれば、現在のメモリ管理量は妥当なのかもしれない。

16MBのデータファイルを5個開こうとしている事に無理があるのかな。それでも80MBなんだが。メインメモリは2GBもあるのに。

C言語(JNI側)

for (int i = 0; i < 5; i++)
  K[i].pDataBuffer = (char *)malloc(1024 * 1024 * 16);

同じバッファをJava側で確保しようとしたら、3個目でOutOfMemoryした。

変な考えを起こさないで最初からC言語で確保すれば良かった。この領域、プログラム終了まで解放しないので、問題ないみたい。最初、JNIで確保するとリークするのかと思っていた。そんなことは無い。JNIは単にNativeなだけで直接Linuxを呼び出しているだけのようだ。

android 端末のgoogle drive の不思議

nexus7でgoogleDriveを使っている。

abc.XXXXzというファイルと130716A.XXXXzというファイルがある。

abcはタップしても『ファイル形式abc.XXXXzは非対応です』と表示される。130716Aはアプリが起動される。この違いは何だろうか。拡張子が同じなのに片方だけがアプリ起動されるのは何故だろう。

-----------------------------

検証1:アプリからそれぞれのファイルを開けば、正常に開くことができる。

検証2:グーグルドライブ上のアイコンが異なる。abcは横棒3本の下に▼、130716aはドキュメントページのような青いアイコン。

検証3:プロパティに違ったところは見受けられない。種類は共に不明な種類

-----------------------------

abc.XXXXzをGmailで自分宛に送った。

受信したメールの添付ファイルabc.XXXXzをタップ=>アプリが起動される。

ドライブ上のabc.XXXXzを削除。

受信したメールの添付ファイルabc.XXXXzをドライブに保存。

-----------------------------

グーグルドライブ上のアイコンが青いアイコンになった。

グーグルドライブでタップするとアプリが起動されるようになった。もう一つのファイルと動きが同じになった。

-----------------------------------------------------------------

結果の推測

・google driveに格納する際に、何かしらのMimeTypeが付けられるのかもしれない。最初にあったabc.XXXXzはUSBのデバッガ経由でコピーしたものを入れたような気がする。コピーの仕方によってはMimeTypeが付加されないのかもしれない。これはGoogleDriveのファイルは格納時にMimeTypeを記述するという前提(推測)。

・XXXXzは 内容はGZ圧縮してあるため、Gmailから起動すると、application/x-gzip-compressed となっているようだ。このMimeTypeが有効ではなかったのか。しかし、driveアプリでファイルの情報を見ても、種類は不明な種類という表示になっている。ここにMimeTypeが表示されていれば判りやすいのに。でもここはGoogle形式以外は全て『不明な種類』という表示になっているようだ

------------------------------------------------------------------

独り言:googleのMimeTypeや拡張子に関する文書は無いのかな。英語でもいいんだけど、、、、探しきれていないだけなのかな?

2014年9月5日金曜日

Android 開発 Uriで受け取ったファイルの元のファイル名とサイズの取り出し方

ContentResolver cr = getContentResolver();
String[] projection = {MediaStore.MediaColumns.DISPLAY_NAME, MediaStore.MediaColumns.SIZE};
Cursor metaCursor = cr.query(uri, projection, null, null, null);
if (metaCursor != null) {
    try {
        if (metaCursor.moveToFirst()) {
            orgFileName = metaCursor.getString(0);
            orgSize = metaCursor.getString(1);
        }
    } finally {
        metaCursor.close();
    }
}

ずっと悩んでいたが解決した。そうだよね、取り出し方が無いなんてことはないでしょ。

2014年6月13日金曜日

Drvie APIの日本語訳ならここ。ここだけでも十分理解できる。

 

http://junsuke.hatenablog.com/entry/2014/02/20/095631

結局このサイトが一番判りやすかった。単なる日本語訳なんだけど、ありがたいですね。だれかGoogleの説明を日本語に訳してくれないかな。どうしても、重要な部分がどこかを判断するまでに時間が掛かってしまい、だんだんと面倒になってきて、別の解説サイトを検索してしまう。これは良くないですね。

日本語が一番わかりやすい。しかもこのサイトは正確に訳していると思う。

追記(2014/09/07)
Android 4.4(KitKat)以降は以下の説明を読んで下さい。もっと簡単なStorage Access Frameworkというものが使えるようになっています。FileOpenDialogが使えるようになりました。但し、今の所、外付けUSBメモリは自動的には対応していない。GoogleDrive(複数アカウントでも可能)と自分のSDカードはドライブ(rootフォルダ)として見えるようになっていてそれを選択できる。ファイル選択をインテント起動して、インテント起動の結果としてUriを受け取ることができる。

https://developer.android.com/guide/topics/providers/document-provider.html

2014年6月7日土曜日

WiFi接続その2

Androidの端末のIPを見るのが面倒で、そのIPを間違いなく手入力するのが面倒だなーって、自動的にできないかなと思ってつまらないアプリを作った。

image

再表示釦を押すとWiFi接続のIPアドレスなどが表示される。

その後、

REM set ADB connection to IP 
ChangeAdbConnectionToTcpIp 192.168.13.135


のようなテキストを共有しようとする。IPアドレスは先ほど表示したIPアドレスである。


このとき、共有先をエディタ(Jota+など)にすると、所謂テキストコピーされる。


Jota+でファイル共有させると、ファイル保存(画面有り)して、共有先の問い合わせとなるので、bluetoothを選択して、bluetoothをPCと接続しておけば、そこで保存したファイルをPCに送ることができる。


REM set ADB connection to IP.txt


上記のテキストを受け取ったPCは拡張子を.batにする。


REM set ADB connection to IP.bat


そして、


http://2den.blogspot.jp/2014/06/android-debug-bridge-wifi.html


で作ったバッチファイルを


@echo off
REM ----------------------------
REM ----------------------------
set ADB_IPADR=%1
echo %1
C:
cd C:\Android\android-sdk\platform-tools
set ADBHOST=%ADB_IPADR%
adb kill-server
timeout /T 2
adb start-server
timeout /T 2
adb connect %ADB_IPADR%:55555
timeout /T 10
adb devices
pause


として、


ChangeAdbConnectionToTcpIp.bat として保存しておく。


REM set ADB connection to IP.batを実行すると、WiFiデバッグが設定される。


 


まあ、ここまでやるのなら手で操作すればってことだよね。


まあ、参考のため、アプリのソースの核だけでも。


    WifiManager wifiManager = (WifiManager) getSystemService(WIFI_SERVICE);
    if (wifiManager == null)
    {
        Toast.makeText(this, "WIFIアクセスできませんでした。", Toast.LENGTH_LONG).show();
        return;
    }
    WifiInfo w_info = wifiManager.getConnectionInfo();
    int ip_addr_i = w_info.getIpAddress();
    String ip_addr = ((ip_addr_i >> 0) & 0xFF) + "." + ((ip_addr_i >> 8) & 0xFF) + "." + ((ip_addr_i >> 16) & 0xFF) + "." + ((ip_addr_i >> 24) & 0xFF);


    ((TextView)findViewById(R.id.txtIP)).setText(ip_addr);
    ((TextView)findViewById(R.id.txtSsid)).setText(w_info.getSSID());
    ((TextView)findViewById(R.id.txtMac)).setText(w_info.getMacAddress());
    String netid = "";
    netid = String.format("%d", w_info.getNetworkId());
    ((TextView)findViewById(R.id.txtNetId)).setText(netid);
    Toast toast = Toast.makeText(this, "表示を更新しました。", Toast.LENGTH_SHORT);
    toast.setGravity(Gravity.TOP, 0, 0);
    toast.show();
    String strADBcmd = "";
    strADBcmd = String.format("REM set ADB connection to IP \r\nChangeAdbConnectionToTcpIp %s\r\n", ip_addr);
    Intent sendIntent = new Intent();
    sendIntent.setAction(Intent.ACTION_SEND);
    sendIntent.putExtra(Intent.EXTRA_TEXT, strADBcmd);
    sendIntent.setType("text/txt");
    startActivity(sendIntent);


 


でも、うまく行かない時がある。結局、USB接続しなおして、 adb tcpip 55555をやらないとうまくいかないな。

2014年6月6日金曜日

Android Debug Bridge を WiFi経由で接続する。

Android Debug Bridge を WiFi経由で接続する。

    Nexus7 2013で確認済み。PCはThinkpadT520 8GB

 

    Android端末の 開発者設定、USBデバッグ接続はチェックONしておくこと。
    バッチファイルで説明
C:\Android\android-sdk\platform-toolsにADBがあるので、カレントにします。
ADB_IPADRは私の場合のAndroid端末のIPアドレスです。
接続中のWiFiをタップすると表示されます。
 以下にバッチファイルを示します。


 この後、eclipseを立ち上げればWiFi経由でデバッグできます。
 アンドロイド端末がスリープすると繋がらなくなります。
 何度起動しても大丈夫です。うまくいかなくなったら、Eclipseを再起動します。
 端末を再起動してもいいです。
   
@echo off
REM ----------------------------
REM ----------------------------
set ADB_IPADR=192.168.2.201
C:
cd C:\Android\android-sdk\platform-tools
set ADBHOST=%ADB_IPADR%
adb kill-server
timeout /T 2
adb start-server
timeout /T 2
adb connect %ADB_IPADR%:55555
timeout /T 10
adb devices
pause
    こんな感じ。