Androidで使えるいいエディタはないでしょうか

2,407 views
Skip to first unread message

たろサ

unread,
Oct 21, 2010, 9:47:49 AM10/21/10
to 日本Androidの会
 こんにちは、たろサです。

 現在、初心者ながら、Androidで上で動くスクリプトを作っているものです。Android単
体でプログラムが作れて面白いのですが、なかなかコーディングしやすい良いエディタを
見つけられません。
 一番の理想は、こちらのプログラム(スクリプト側)からスクリプトファイル名とエラー
行番号をintentで投げたら、そのファイルを開いてくれて問題の行にカーソルがいる。
 そして、こちらにintentでスクリプトファイル名を投げてくれたら、そのスクリプトを
走らせるという風なキャッチボールができれば理想です。

 これは無理としても、ファイル名を投げるとキャッチして開いてくれるエディタって、
どこかに無いでしょうか。
 無いとなると自作するしかないのかな・・・。

 もし、何か情報がありましたら、よろしくお願いします。

--
山本三七男 (Minao Yamamoto) ---------------- ハンドル:たろサ -----
E-Mail: taro...@gmail.com

shirou

unread,
Oct 21, 2010, 11:40:47 AM10/21/10
to 日本Androidの会
こんにちは。 shirouと申します。

sheditor liteというテキストエディタを作成し、つい三日前にマーケットで公開しました。
フォントサイズや色の変更、フルスクリーンモード、Undo、インクリメンタルサーチ、置換など、
基礎的なエディタの機能を備えています。

このアプリケーションはaction.VIEWを受け取り、intentに含まれるURIを開くこともできます。
ただ、指定の行にカーソルがいるということはできません。
これは仕様が決まってない(あるのでしたらすいません)ためで、行数を指定する案があれば実装します。

file schemeでqueryを使っていいのかどうか分かりませんが、例えば
file:///sdcard/somewhere/test.sh?line=100
とかでしょうか。

一方、送る方ですが、このアプリケーションはaction.SEND、text/plainにてextra領域に
テキスト文字列を入れて送ることが出来ます。
action.VIEWでファイルパスを送ることもできれば良いのかもしれませんが、
action.SENDを送りたい場合もあるでしょうから、使い分けが難しいのではないかと考え、
このようにしました。


sheditorはまだまだ不具合も多いとは思いますが、無料ということもありますので、
試しに使ってみて頂けると幸いです。
また、Android上のテキストエディタとしては、Satoshi様が作られたgEditorもあります。
こちらも試してみてはいかがでしょうか。


以上です。

よろしくお願いします。
> E-Mail: taros...@gmail.com

たろサ

unread,
Oct 21, 2010, 12:39:11 PM10/21/10
to android-g...@googlegroups.com
 shirouさん、はじめまして、たろサです。

> sheditor liteというテキストエディタを作成し、つい三日前にマーケットで公開しま
した。

 早速、ダウンロードさせていただきました。エディタぽくってすごくいい感じです。ス
クリプト側には既に送信機能を作ってあったので、「file:///sdcard/luarida
/touchsample.lua」というURIを投げたところ、
「android.content.ActivityNotFoundException: No Activity found to handle Intent
{ act=android.intent.action.VIEW dat=file:///sdcard/luarida/touchsample.lua }」
というエラーがでました。

 こちら側で、何か設定をしなければいけないのでしょうか。例えば、
http://www.google.com」を投げると、ブラウザが立ち上がることは確認しています。

javaプログラムは、
Uri data = Uri.parse(strText);
Intent it = new Intent();
it.setAction(Intent.ACTION_VIEW);
it.setData(data);
startActivity(it);
こんな感じです。


> file schemeでqueryを使っていいのかどうか分かりませんが、例えば
> file:///sdcard/somewhere/test.sh?line=100
> とかでしょうか。

 仕様は何も考えていないです。私の方はとても嬉しいです。この仕様で十分です。


> 一方、送る方ですが、このアプリケーションはaction.SEND、text/plainにてextra領域に
> テキスト文字列を入れて送ることが出来ます。
> action.VIEWでファイルパスを送ることもできれば良いのかもしれませんが、
> action.SENDを送りたい場合もあるでしょうから、使い分けが難しいのではないかと考え、
> このようにしました。

 了解しました。とは言うものの、まだ、Android & java初心者なので、上の意味がほと
んど理解できていなかったりします。受ける側も勉強してみたいと思います。

> sheditorはまだまだ不具合も多いとは思いますが、無料ということもありますので、
> 試しに使ってみて頂けると幸いです。
 はい、使わせていただきます。何か気がついたことがありましたら、報告させてもらい
ます。
 ちなみに私の作っているものはLuaridaというLua言語のスクリプトです。マーケットに
無料公開しています。Androidプログラムを勉強するのにちょうど良い題材かなぁと思っ
て9月頃からチマチマ作り始めました。


> また、Android上のテキストエディタとしては、Satoshi様が作られたgEditorもあります。
> こちらも試してみてはいかがでしょうか。
 gEditorも知り合いから紹介してもらいました。「file:///sdcard/luarida
/touchsample.lua」を投げても同じようなエラーが出たので、対応していないのかなぁと
思って、メール投稿させていただきました。
 エラーが出るのは、こちらのプログラムが悪い性なのかなぁ・・・。

E-Mail: taro...@gmail.com

たろサ

unread,
Oct 21, 2010, 11:38:57 PM10/21/10
to android-g...@googlegroups.com
 たろサです。

 テストした結果を報告します。

Uri data = Uri.parse(strText);
Intent it = new Intent();

//it.setAction(Intent.ACTION_VIEW);
it.setAction(Intent.ACTION_SEND);
it.setData(data);
startActivity(it);
にしてみました。

 こうすると、SEND待ちのアプリの一覧が出てきました。sheditor liteは出てきません
でした(←待っていないのかな)。
 strText="file:///sdcard/luarida/editlua.lua";を渡しても、何も起きず・・・。当
たり前かも知れませんが。

 次に、
it.setAction(Intent.ACTION_VIEW);
it.setType("text/plain");
にしてみました。すると、setType("text/plain");を見ているアプリもいるのですね。
gEditorとTextEditが出てきました。そして、起動するのですが起動するだけでした。
file://を取っていないのかな。

 次に、
it.setAction(Intent.ACTION_SEND);
it.setType("text/plain");
を試してみましたが、同様でした。

 残念ながら、結局、sheditor liteはいずれの場合にも、一覧に出てきませんでした。

 そもそも、"file:///sdcard/luarida/editlua.lua"を渡すという発想がいけないので
しょうか。ちなみに、"file:///sdcard/luarida/editlua.txt"と拡張子を変更しても同様
の結果でした。

>  了解しました。とは言うものの、まだ、Android& java初心者なので、上の意味がほと

shirou

unread,
Oct 22, 2010, 9:02:54 AM10/22/10
to 日本Androidの会
shirou です。
確認ありがとうございます。

自分でもテストしてみました。
結果として、一覧に出てきませんでした。
確認が甘くてご迷惑をおかけし、申し訳ありません。
# AndExplorerからは開けたので、問題がないのかと思っていました。

現在、インテントフィルタにはこう書いてあり、

<intent-filter>
<action android:name="android.intent.action.VIEW" />
<action android:name="android.intent.action.SEND" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="file" android:mimeType="text/*" />
<data android:pathPattern=".*\\.txt" />
<data android:pathPattern=".*\\.html" />
<data android:host="*" />
</intent-filter>

テストとして、
Intent i = new Intent();
i.setData(Uri.parse("file:///sdcard/test.txt"));
i.setType("text/plain");
i.setAction(Intent.ACTION_VIEW);
startActivity(i);
というコードを実行してみましたが、一覧に出てきませんでした。


どなたか、問題が分かる方がいらっしゃいましたらご教授頂けるとありがたいです。

また、IntentはExtraも合わせるといろいろな組み合わせがあるように見えます。
こういう場合はこう使え、というベストプラクティスみたいなものがまとまっている場所は
ありますでしょうか。


よろしくお願いします。
> E-Mail: taros...@gmail.com

shirou

unread,
Oct 24, 2010, 1:07:57 AM10/24/10
to 日本Androidの会
shirou です。

問題を解決し、更新したものを sheditor lite バージョン 0.2.3 としてマーケットに公開しました。

問題点は二つ有りました。簡単に述べると、

- 1. Intent.setType() は Intent.stData() で設定したURIを消してしまう
- 2. VIEWとSENDの両方を受けたい場合は、<intent-filter>を別々に書く

ということでした。

1.についてですが、そのままで、setTypeは設定したURIを消してしまうのですね。
ちゃんとドキュメントに書いてありました。大変失礼しました…
ですので、URIとMIME Typeの両方を設定したい場合は、setDataAndType()を使う、ということでした。
具体的には以下のようなコードです。

Intent i = new Intent();
i.setDataAndType(Uri.parse("file:///sdcard/dropbox/ss.txt"), "text/
plain");
i.setAction(Intent.ACTION_VIEW);
startActivity(i);

2.についてですが、当初<intent-filter>には受ける全てのActionを書いておくと思っていましたが、違うようで、
新しい別の<intent-filter>に書き直したところ、ACTION_SENDも受けられるようになりました。


また、問題の更新のついでに、 ACTION_VIEWのURIに行番号を指定して開くという機能を追加しました。
i.setDataAndType(Uri.parse("file:///sdcard/dropbox/ss.txt?line=3"),
"text/plain");
として line を付け加えると、指定した行数にカーソルがあたって開きます。

なお、SENDに関しては、EXTRA_TEXTに入れた文字列を使って開きます。

i.setAction(Intent.ACTION_SEND);
i.putExtra(Intent.EXTRA_TEXT, "hogehoge");
startActivity(i);

としてインテントを送ると、"hogehoge"という文字列が入った状態で開きます。
sheditorから送るときも、このACTION_SENDにEXTRA_TEXTを付けて送ります。


以上です。

いろいろと勉強になりました。
ありがとうございました。

たろサ

unread,
Oct 24, 2010, 5:07:25 AM10/24/10
to android-g...@googlegroups.com
 shirouさん、

 たろサです。
 最新版をダウンロードしてテストしてみました。

> Intent i = new Intent();
> i.setDataAndType(Uri.parse("file:///sdcard/dropbox/ss.txt"), "text/plain");
> i.setAction(Intent.ACTION_VIEW);
> startActivity(i);

 上のようにプログラムを変更してみました。
 きちんと、sheditor liteに受け取ってもらえました。また、'?line=3'を追加した場合
も、指定の行で開くことを確認しました。

 拡張子luaにも対応していただいて嬉しいです。

 欲を言えば、エディットファイルの起動ですね。今度はこちらで「file:///sdcard
/hogehoge/hoge.lua」を受け取るようなプログラムを作らないといけないのですね。
 また、ここら辺の書き方を、時間のあるときに詳しく教えてください。

 Luaridaからの暗黙呼び出しのコマンドを実装するのは週末くらいになってしまうと思
います。Typeも引数で取れるようにして、SENDにも対応させようかなと思っています。

 ここら辺の呼び出しができると、いろいろとスクリプトでちょちょっと書けちゃいそう
ですね。

--
山本三七男 (Minao Yamamoto) ---------------- ハンドル:たろサ -----

E-Mail: taro...@gmail.com

shirou

unread,
Oct 24, 2010, 10:50:05 AM10/24/10
to 日本Androidの会
shirou です。

確認ありがとうございます。
無事起動できたということでよかったです。

> 欲を言えば、エディットファイルの起動ですね。今度はこちらで「file:///sdcard/hogehoge/hoge.lua」を受け取るようなプログラ ムを作らないといけないのですね。
> また、ここら辺の書き方を、時間のあるときに詳しく教えてください。

ACTION_VIEWを受け取るには、AndroidManifest.xmlに
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<data android:scheme="file" android:mimeType="text/*"/>
<intent-filter>
と書けばよいようです。
<data> で"file://"のURIかつ"text/*"のMIME typeのインテントを受け取ることを指定します。

Manifestにこう書いておき、JavaのほうではonCreate()に

if(Intent.ACTION_VIEW.equals(getIntent().getAction())) {
Uri d = intent.getData();
if (d != null){
fileOpen(d.getPath());
}
}else{
// 普通にLauncherから起動された場合
}

とすれば良いと思います。ぐぐればいろいろ出てくると思います。

> ここら辺の呼び出しができると、いろいろとスクリプトでちょちょっと書けちゃいそう
> ですね。

実は sheditor はシェルスクリプトを書きたいために作ったものでして(だから sh とついています)
いろいろ使っていただけるとありがたいです。
# 実際にはまだまだ機能が足りませんけど…

というわけで、送るインテントをSENDとVIEWと変えられるような設定を付け加え、
version 0.3 としてマーケットで公開しました。
VIEWの場合、URIにファイルパスが入っていますので、getPath()で取得できます。

# ACTION_RUN のほうがいいのかもしれませんが…
# ちなみにScripting Layer for Android(SL4A) では
# com.googlecode.android_scripting.action.LAUNCH_TERMINAL というのを定義しているよう
です。

以上です。
お時間があるときで構いませんので、試して頂けるとありがたく思います。
> >>>>  エラーが出るのは、こちらのプログラムが悪い性なのかなぁ・・・。...
>
> もっと読む ≫

たろサ

unread,
Oct 24, 2010, 11:16:53 AM10/24/10
to android-g...@googlegroups.com
shirouさん、

 たろサです。

 詳しい説明ありがとうございます。

 Luaridaのメニュからスクリプト起動とエディタ起動を分けられるようにして、さっそ
く、便利に使わせてもらっています。

 2時間くらい前、twitterで返信したのですが、こちらでも書いておきます。
 sheditor liteでファイルを開くと、先頭に必ず改行が挿入されるようです。

 下記の件は、時間のあるときに、ためさせていただきます。

shirou

unread,
Oct 24, 2010, 11:46:41 AM10/24/10
to 日本Androidの会
shirou です。

ご報告ありがとうざいます。
修正し、0.3.1として公開しました。

# このスピード感はiPhoneにはないですね
> >>>>>  そもそも、"file:///sdcard/luarida/editlua.lua"を渡すという発想がいけないので...
>
> もっと読む ≫

たろサ

unread,
Oct 28, 2010, 9:56:19 AM10/28/10
to android-g...@googlegroups.com
 たろサです。

 shirouさんの説明通りにしたら、intentを受けられるようになりました。ありがとうご
ざいます。

 スクリプト実行中にエラーが起きたときに、エラー箇所の行番号を持ってエディタを呼
ぶようにもしました。Luarida Ver1.20Betaとして公開しました。

 ただ、shedit liteと同様に、


<data android:scheme="file" android:mimeType="text/*"/>

という感じで指定したので、このintentのときに、常にsheditor liteを開くようにして
いると、Luaridaに渡せないので、少し考えものかも知れません。
 何か良いアイデアは無いでしょうか。

 また、エディタが直ぐ呼べて、エディタからもLuaridaが呼べて、凄く便利になったの
ですが、Luarida→sheitor lite→Luarida→sheditor lite→Luaridaとintentを繰り返してい
ると、呼び出し履歴がスタックされるみたいで、一度、ランチャに戻ると、Luaridaアイ
コンをタッチしても、sheditor liteしか立ち上がらなくなってしまいました。呼び出し
た回数分、sheditor liteを終了させ続けなければなりません。

 このスタックを回避する方法は、あるのでしょうか。

(2010/10/24 23:50), shirou wrote:

たろサ

unread,
Oct 29, 2010, 1:48:39 AM10/29/10
to android-g...@googlegroups.com
 たろサです。

>  ただ、shedit liteと同様に、
> <data android:scheme="file" android:mimeType="text/*"/>
> という感じで指定したので、このintentのときに、常にsheditor liteを開くようにして
> いると、Luaridaに渡せないので、少し考えものかも知れません。
>  何か良いアイデアは無いでしょうか。

 これについて、明示的にintentで渡してやればいいことに気づきました。
 例えば、Luaridaだと、下記のような感じにすれば渡せました。

strText = "file://sdcard/luarida/hoge.lua";
String luarida = "com.momoonga.luarida.LuaridaActivity";
it = new Intent(Intent.ACTION_VIEW);
int idx = luarida.lastIndexOf('.');
String pkg = luarida.substring(0, idx);
Uri data = Uri.parse(strText);
it.setClassName(pkg, luarida);
it.setDataAndType( data, "text/plain" );
it.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(it);

 ここで質問なのですが、明示的に渡す場合、他のアプリのクラス名とアクティビティ名
を知る必要があるのですが、どのようにしたら、調べることができるのでしょうか。

 他のアプリのAndroidManifest.xmlが見れればいいのですが。

akira Sugimoto

unread,
Oct 29, 2010, 5:53:50 AM10/29/10
to 日本Androidの会
はじめまして。杉本と申します。

>  ここで質問なのですが、明示的に渡す場合、他のアプリのクラス名とアクティビティ名
> を知る必要があるのですが、どのようにしたら、調べることができるのでしょうか。

ここで言うクラス名とアクティビティ名は同じものではないのでしょうか?
パッケージ名+アクティビティ(クラス)名(例:com.momoonga.luarida.LuaridaActivity)
が必要なのではないのでしょうか?
AndroidManifest.xmlで定義されていないクラス名は取得できないのではないかと思います。
AndroidManifest.xmlで定義されているアクティビティにIntentが定義されていない場合、
AndroidManifest.xmlを直接見ない限りアクティビティ名を取得できないのではないかと思います。
AndroidManifest.xmlで定義されているアクティビティにIntentが定義されていれば
(通常のアプリは起動元となるアクティビティにランチャーのカテゴリが定義されているはずです)
Intentでアプリの情報を引き出せると思います。

以下のようにしてアプリの情報を取得してはいかがでしょうか。

// メイン画面から起動できるアプリの一覧を取得
Intent intent = new Intent(Intent.ACTION_MAIN, null);
intent.addCategory(Intent.CATEGORY_LAUNCHER);
PackageManager packageManager = getPackageManager();
List<ResolveInfo> appList =
packageManager.queryIntentActivities(intent,0);
// ソート
Collections.sort(appList,new
ResolveInfo.DisplayNameComparator(packageManager));
// 一覧を保存。
List<String> name = new ArrayList();
for (ResolveInfo info : appList) {
name.add(info.activityInfo.name);
}

以下でカテゴリをランチャーで指定してます。
intent.addCategory(Intent.CATEGORY_LAUNCHER);

今回必要になる情報は以下で取得しています。
info.activityInfo.name:パッケージ名.アクティビティ名
他にも
info.activityInfo.packagename:パッケージ名
info.loadLabel(packageManager):ラベル名
等があります。
ラベル名を同時に取得すれば目的のパッケージ名+アクティビティ名を
見つけるときの助けになるはずです。

まだAndroidを初めたばかりなので見当はずれな意見かもしれませんが
何かのお役にたてれば幸いです。
> ...
>
> もっと読む ≫

たろサ

unread,
Oct 29, 2010, 10:49:11 AM10/29/10
to android-g...@googlegroups.com
 杉本さん、初めまして、たろサです。

> ここで言うクラス名とアクティビティ名は同じものではないのでしょうか?
> パッケージ名+アクティビティ(クラス)名
(例:com.momoonga.luarida.LuaridaActivity)
> が必要なのではないのでしょうか?

 はい、その通りです。それを調べたいと思っていました。 
 杉本さんの下記の説明で、取得することができました。

 せっかく作ったので、Googleマーケットに登録しておきました。GetIntentClassNameと
いうアプリ名です。

 取得したクラス名をIntent.ACTION_SENDで丸投げするという荒っぽいツールです。
 誰も使わないだろうなぁ。

 杉本さん、ありがとうございました。 

Reply all
Reply to author
Forward
0 new messages