jpgファイルを暗黙インテントで印刷アプリに渡すと落ちてしまいます。分かる方ご教授お願いします。

933 views
Skip to first unread message

leadsystem

unread,
Nov 9, 2011, 5:42:20 AM11/9/11
to 日本Androidの会
Android端末上で画面上に文字を描きSDカード内にjpg形式の画像として保存するアプリを作成中です。
画像を作成してSDカードに保存した後に画像を読み込み暗黙インテントでEpsonから出されているiprintソフトに引き渡すと
**********************************************************
エラー
Epson iPrint(epson.print)が予期せず停止しました。やり直してください。
**********************************************************
で落ちてしまします。
ちなみに他の印刷アプリ「Clud Print」 「Cypria」等は問題なく開きます。
iPrintのみを起動して、SDカードに保存された画像を開いた場合には問題ありません。
Epsonに問い合わせしましたが、弊社のソフトのみを起動して使えるのでサポート外と言われてしまいました。
heap領域が原因かた思いましたが、それらしきlogも見当たらず特定が出来ません。
宜しくお願いします。端末SC-01C(root奪取済)


↓ 以下LOG ↓

11-09 16:54:00.093: I/InputReader(469): dispatchTouch::touch event's
action is 0
11-09 16:54:00.093: I/InputDispatcher(469): Delivering touch to
current input target: action: 0, channel '40a870d8 android/
com.android.internal.app.ResolverActivity (server)'
11-09 16:54:00.093: I/PowerManagerService(469): Ulight 3->7|0
11-09 16:54:00.277: I/InputReader(469): dispatchTouch::touch event's
action is 1
11-09 16:54:00.277: I/InputDispatcher(469): Delivering touch to
current input target: action: 1, channel '40a870d8 android/
com.android.internal.app.ResolverActivity (server)'
11-09 16:54:00.292: I/ActivityManager(469): Starting: Intent
{ act=android.intent.action.SEND typ=image/jpg flg=0x3800000
cmp=epson.print/.ActivityViewImageSelect (has extras) } from pid 469
11-09 16:54:00.328: I/ActivityManager(469): Start proc epson.print for
activity epson.print/.ActivityViewImageSelect: pid=2214 uid=10143
gids={3003, 1015}
11-09 16:54:00.441: I/System.out(2214): begin load epsonImage lib
11-09 16:54:00.453: I/System.out(2214): load epsonImage lib finish
11-09 16:54:00.597: W/dalvikvm(2214): threadid=1: thread exiting with
uncaught exception (group=0x40015578)
11-09 16:54:00.601: E/AndroidRuntime(2214): FATAL EXCEPTION: main
11-09 16:54:00.601: E/AndroidRuntime(2214):
java.lang.RuntimeException: Unable to start activity
ComponentInfo{epson.print/epson.print.ActivityViewImageSelect}:
java.lang.NullPointerException
11-09 16:54:00.601: E/AndroidRuntime(2214): at
android.app.ActivityThread.performLaunchActivity(ActivityThread.java:
1651)
11-09 16:54:00.601: E/AndroidRuntime(2214): at
android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:
1667)
11-09 16:54:00.601: E/AndroidRuntime(2214): at
android.app.ActivityThread.access$1500(ActivityThread.java:117)
11-09 16:54:00.601: E/AndroidRuntime(2214): at
android.app.ActivityThread$H.handleMessage(ActivityThread.java:935)
11-09 16:54:00.601: E/AndroidRuntime(2214): at
android.os.Handler.dispatchMessage(Handler.java:99)
11-09 16:54:00.601: E/AndroidRuntime(2214): at
android.os.Looper.loop(Looper.java:123)
11-09 16:54:00.601: E/AndroidRuntime(2214): at
android.app.ActivityThread.main(ActivityThread.java:3687)
11-09 16:54:00.601: E/AndroidRuntime(2214): at
java.lang.reflect.Method.invokeNative(Native Method)
11-09 16:54:00.601: E/AndroidRuntime(2214): at
java.lang.reflect.Method.invoke(Method.java:507)
11-09 16:54:00.601: E/AndroidRuntime(2214): at
com.android.internal.os.ZygoteInit
$MethodAndArgsCaller.run(ZygoteInit.java:842)
11-09 16:54:00.601: E/AndroidRuntime(2214): at
com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600)
11-09 16:54:00.601: E/AndroidRuntime(2214): at
dalvik.system.NativeStart.main(Native Method)
11-09 16:54:00.601: E/AndroidRuntime(2214): Caused by:
java.lang.NullPointerException
11-09 16:54:00.601: E/AndroidRuntime(2214): at
epson.print.ActivityViewImageSelect.getRealPathFromURI(ActivityViewImageSelect.java:
825)
11-09 16:54:00.601: E/AndroidRuntime(2214): at
epson.print.ActivityViewImageSelect.onCreate(ActivityViewImageSelect.java:
149)
11-09 16:54:00.601: E/AndroidRuntime(2214): at
android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:
1047)
11-09 16:54:00.601: E/AndroidRuntime(2214): at
android.app.ActivityThread.performLaunchActivity(ActivityThread.java:
1615)
11-09 16:54:00.601: E/AndroidRuntime(2214): ... 11 more
11-09 16:54:00.601: W/ActivityManager(469): Force finishing activity
epson.print/.ActivityViewImageSelect
11-09 16:54:00.605: E/(469): Dumpstate > /data/log/dumpstate_app_error
11-09 16:54:00.613: I/dumpstate(2223): begin
11-09 16:54:01.105: W/ActivityManager(469): Activity pause timeout for
HistoryRecord{4052c210 epson.print/.ActivityViewImageSelect}
11-09 16:54:04.039: I/dumpstate(2223): done
11-09 16:54:06.285: W/PowerManagerService(469): Timer 0x7->0x3|0x0
11-09 16:54:06.285: I/PowerManagerService(469): Ulight 7->3|0
11-09 16:54:07.585: E/BatteryPolicy(530): onReceive intent:Intent
{ act=android.intent.action.BATTERY_CHANGED flg=0x60000000 (has
extras) }
11-09 16:54:14.265: W/ActivityManager(469): Activity destroy timeout
for HistoryRecord{4052c210 epson.print/.ActivityViewImageSelect}

↑ ここまで ↑

Hiroshi SAKURAI

unread,
Nov 9, 2011, 8:14:39 AM11/9/11
to android-g...@googlegroups.com
桜井と申します。

> java.lang.NullPointerException
> 11-09 16:54:00.601: E/AndroidRuntime(2214): at
> epson.print.ActivityViewImageSelect.getRealPathFromURI(ActivityViewImageSelect.java:
> 825)

落ちている関数名から推測すると、考えられる原因としては
A. 渡したURIが、Uri型ではない。
B. 渡したURIが、"file://"で始まるUriではない。
C. URIがfile://だとNGで、content://で始まるUriである必要がある。
くらいですかね。

Hiroshi SAKURAI

2011/11/9 leadsystem <t-tak...@leadinet.com>:

> --
> このメールは Google グループのグループ「日本Androidの会」の登録者に送られています。
> このグループに投稿するには、android-g...@googlegroups.com にメールを送信してください。
> このグループから退会するには、android-group-j...@googlegroups.com にメールを送信してください。
> 詳細については、http://groups.google.com/group/android-group-japan?hl=ja からこのグループにアクセスしてください。
>
>

leadsystem

unread,
Nov 10, 2011, 6:00:35 AM11/10/11
to 日本Androidの会
桜井様 and 分かる方

早速のお返事ありがとうございました。

下記Aは元プログラムです。(前回エラー)

A
Uri uri = Uri.fromFile(new File("/sdcard/nscmp.jpg"));
Intent intent = new Intent();
intent.setAction(Intent.ACTION_SEND);
intent.setType("image/jpeg");
intent.putExtra(Intent.EXTRA_STREAM, uri);
startActivity(intent);


それをBに書きなおしましたが現象は変わりません。(今回エラー)

B
Intent intent = new Intent();
intent.setAction(Intent.ACTION_SEND);
intent.setType("image/jpeg");
intent.putExtra(Intent.EXTRA_STREAM, Uri.parse("file:///sdcard/
nscmp.jpg"));
startActivity(intent);



Cに関してはcontent://の指定の仕方が分かりません。
sdカード内のjpgファイを直接指定しているのであまり関係ないような気もしますが・・・・


もう一度現象をみると(作成中アプリからSDカード内に保存したjpgファイルを選択)

iPrintから直接 → OK
ファイルエクスプローラからiPrint → OK
作成中アプリから他のソフト → OK
作成中アプリからiPrint → NG


前回ご指摘いただいたエラーは解消さえれていない様です。
何か別の箇所が原因かもしれませんが、全く特定が出来ません。。
Bで実行した際の今回のLOGも再度、掲載させて頂きます。

お手数をお掛けしますがどうか宜しくお願い致します。

高橋

↓ LOGここから ↓


11-10 19:50:06.597: I/InputReader(469): dispatchTouch::touch event's
action is 0
11-10 19:50:06.597: I/InputDispatcher(469): Delivering touch to
current input target: action: 0, channel '40af1150 android/
com.android.internal.app.ResolverActivity (server)'
11-10 19:50:06.597: I/PowerManagerService(469): Ulight 3->7|0
11-10 19:50:06.671: I/InputReader(469): dispatchTouch::touch event's
action is 1
11-10 19:50:06.671: I/InputDispatcher(469): Delivering touch to
current input target: action: 1, channel '40af1150 android/
com.android.internal.app.ResolverActivity (server)'
11-10 19:50:06.820: I/ActivityManager(469): Starting: Intent
{ act=android.intent.action.SEND typ=image/jpeg flg=0x3800000
cmp=epson.print/.ActivityViewImageSelect (has extras) } from pid 469
11-10 19:50:06.937: I/ActivityManager(469): Start proc epson.print for
activity epson.print/.ActivityViewImageSelect: pid=1744 uid=10143
gids={3003, 1015}
11-10 19:50:07.179: I/System.out(1744): begin load epsonImage lib
11-10 19:50:07.199: I/System.out(1744): load epsonImage lib finish
11-10 19:50:07.285: W/dalvikvm(1744): threadid=1: thread exiting with
uncaught exception (group=0x40015578)
11-10 19:50:07.289: E/AndroidRuntime(1744): FATAL EXCEPTION: main
11-10 19:50:07.289: E/AndroidRuntime(1744):
java.lang.RuntimeException: Unable to start activity
ComponentInfo{epson.print/epson.print.ActivityViewImageSelect}:
java.lang.NullPointerException
11-10 19:50:07.289: E/AndroidRuntime(1744): at
android.app.ActivityThread.performLaunchActivity(ActivityThread.java:
1651)
11-10 19:50:07.289: E/AndroidRuntime(1744): at
android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:
1667)
11-10 19:50:07.289: E/AndroidRuntime(1744): at
android.app.ActivityThread.access$1500(ActivityThread.java:117)
11-10 19:50:07.289: E/AndroidRuntime(1744): at
android.app.ActivityThread$H.handleMessage(ActivityThread.java:935)
11-10 19:50:07.289: E/AndroidRuntime(1744): at
android.os.Handler.dispatchMessage(Handler.java:99)
11-10 19:50:07.289: E/AndroidRuntime(1744): at
android.os.Looper.loop(Looper.java:123)
11-10 19:50:07.289: E/AndroidRuntime(1744): at
android.app.ActivityThread.main(ActivityThread.java:3687)
11-10 19:50:07.289: E/AndroidRuntime(1744): at
java.lang.reflect.Method.invokeNative(Native Method)
11-10 19:50:07.289: E/AndroidRuntime(1744): at
java.lang.reflect.Method.invoke(Method.java:507)
11-10 19:50:07.289: E/AndroidRuntime(1744): at
com.android.internal.os.ZygoteInit
$MethodAndArgsCaller.run(ZygoteInit.java:842)
11-10 19:50:07.289: E/AndroidRuntime(1744): at
com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600)
11-10 19:50:07.289: E/AndroidRuntime(1744): at
dalvik.system.NativeStart.main(Native Method)
11-10 19:50:07.289: E/AndroidRuntime(1744): Caused by:
java.lang.NullPointerException
11-10 19:50:07.289: E/AndroidRuntime(1744): at
epson.print.ActivityViewImageSelect.getRealPathFromURI(ActivityViewImageSelect.java:
825)
11-10 19:50:07.289: E/AndroidRuntime(1744): at
epson.print.ActivityViewImageSelect.onCreate(ActivityViewImageSelect.java:
149)
11-10 19:50:07.289: E/AndroidRuntime(1744): at
android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:
1047)
11-10 19:50:07.289: E/AndroidRuntime(1744): at
android.app.ActivityThread.performLaunchActivity(ActivityThread.java:
1615)
11-10 19:50:07.289: E/AndroidRuntime(1744): ... 11 more
11-10 19:50:07.292: E/(469): Dumpstate > /data/log/dumpstate_app_error
11-10 19:50:07.292: W/ActivityManager(469): Force finishing activity
epson.print/.ActivityViewImageSelect
11-10 19:50:07.304: I/dumpstate(1752): begin
11-10 19:50:07.792: W/ActivityManager(469): Activity pause timeout for
HistoryRecord{4081d560 epson.print/.ActivityViewImageSelect}
11-10 19:50:10.671: I/dumpstate(1752): done
11-10 19:50:12.675: W/PowerManagerService(469): Timer 0x7->0x3|0x0
11-10 19:50:12.675: I/PowerManagerService(469): Ulight 7->3|0

↑ LOGここまで ↑



On 11月9日, 午後10:14, Hiroshi SAKURAI <an.olive.t...@gmail.com> wrote:
> 桜井と申します。
>
> > java.lang.NullPointerException
> > 11-09 16:54:00.601: E/AndroidRuntime(2214): at
> > epson.print.ActivityViewImageSelect.getRealPathFromURI(ActivityViewImageSel-ect.java:
> > 825)
>
> 落ちている関数名から推測すると、考えられる原因としては
> A. 渡したURIが、Uri型ではない。
> B. 渡したURIが、"file://"で始まるUriではない。
> C. URIがfile://だとNGで、content://で始まるUriである必要がある。
> くらいですかね。
>
> Hiroshi SAKURAI
>
> 2011/11/9 leadsystem <t-takaha...@leadinet.com>:
> > epson.print.ActivityViewImageSelect.getRealPathFromURI(ActivityViewImageSel-ect.java:
> > 詳細については、http://groups.google.com/group/android-group-japan?hl=jaからこのグループにアクセスしてください。- 引用テキストを表示しない -
>
> - 引用テキストを表示 -

元木

unread,
Nov 10, 2011, 7:29:13 AM11/10/11
to android-g...@googlegroups.com
こんばんは、元木です。

Epsonのiprintソフトは、URIをIntent以外の手段で渡している様子です。

手元の実機(IS05)で確かめてみたところ、
leadsystem様の元プログラムのIntentを投げたときのログは

【ログA】
11-10 21:04:46.783: INFO/ActivityManager(296): Starting activity: Intent { act=android.intent.action.SEND typ=image/jpeg flg=0x3000000 cmp=epson.print/.ActivityViewImageSelect (has extras) }

ですが、iprintを手で操作したときに得られるログは

【ログB】
11-10 21:01:08.173: INFO/ActivityManager(296): Starting activity: Intent { cmp=epson.print/.ActivityViewImageSelect }

となります。

ログBを得るためのIntentをつくるコードは

        Intent intent = new Intent();
        intent.setClassName("epson.print", "epson.print.ActivityViewImageSelect");
        startActivity(intent);
        
だけでした。

上記コードを実行すると、

【ケース1】
  手でiprintを起動し、画像を一枚表示している(ActivityViewImageSelectが、すでに起動している?)

  結果:iprintが起動し、↑と同じ画像が表示される。
  
【ケース2】
  iprintを起動していない。
  
  結果:iprintは起動するが、画像を表示する部分は真っ白
  
となりました。

Hiroshi SAKURAI

unread,
Nov 10, 2011, 8:02:40 AM11/10/11
to android-g...@googlegroups.com
高橋さん

桜井です。

> Cに関してはcontent://の指定の仕方が分かりません。
> sdカード内のjpgファイを直接指定しているのであまり関係ないような気もしますが・・・・

すみません、書き方がわかりにくかったですね。

ギャラリーなどから画像を共有すると、EXTRA_STREAMに入っているURIは
content://...
という、画像DB内のエントリをさすURIになります。
当然元の画像ファイルはfile://としてSDなどに存在します。

普通画像を受けとることができるアプリは、content://でもfile://でも
受けとることができるように作ります。

iprintソフトは、content://が渡されてくることを前提に作られていて、
file://が渡されると誤動作するのではないか?
というのが、"C"の意味でした。

試しにGhost commanderからiprintに共有すると同じように落ちたので、
Cが怪しいかな、と思います。


Hiroshi SAKURAI

2011/11/10 leadsystem <t-tak...@leadinet.com>:

leadsystem

unread,
Nov 11, 2011, 4:07:27 AM11/11/11
to 日本Androidの会
桜井様 元木様

桜井様、ご説明の詳細ありがとうございました。元木様、ご検証ありがとうございました。
content://... の具体的な記述が分からず、明示的インテント(元木様のプログラム抜粋)で試した所、何故かiPrintに渡せました。
エラーは出ていない様です。backボタンでiPrintから作成中アプリのActivityに戻ってもエラー出ずに戻れました。
プログラムとLOGを再掲載させて頂きます。
何か問題があればご指摘下さい。
お手数をお掛けしますが宜しくお願いします。

*******  明示的インテントプラグラム(sdcard内のjpgをiPrintへ)********

Uri data_uri = Uri.fromFile(new File("/sdcard/nscmp.jpg"));
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setClassName("epson.print","epson.print.ActivityViewImageSelect");
intent.setDataAndType(data_uri, "image/jpg");
startActivity(intent);

**************************************************************


↓ LOGここから ↓

11-11 17:39:23.277: I/InputReader(469): dispatchTouch::touch event's
action is 0
11-11 17:39:23.277: I/InputDispatcher(469): Delivering touch to
current input target: action: 0, channel '40aae120 com.leadsysdeve/
com.leadsysdeve.CustomDrawActivity (server)'
11-11 17:39:23.277: I/PowerManagerService(469): Ulight 3->7|0
11-11 17:39:23.398: I/InputReader(469): dispatchTouch::touch event's
action is 1
11-11 17:39:23.398: I/InputDispatcher(469): Delivering touch to
current input target: action: 1, channel '40aae120 com.leadsysdeve/
com.leadsysdeve.CustomDrawActivity (server)'
11-11 17:39:23.472: I/ActivityManager(469): Starting: Intent
{ cmp=com.leadsysdeve/.DrawNoshi (has extras) } from pid 1734
11-11 17:39:23.476: W/ActivityManager(469): Trying to launch
com.leadsysdeve/.DrawNoshi
11-11 17:39:29.406: W/PowerManagerService(469): Timer 0x7->0x3|0x3
11-11 17:39:29.406: I/PowerManagerService(469): Ulight 7->3|0
11-11 17:39:31.445: E/BatteryPolicy(529): onReceive intent:Intent
{ act=android.intent.action.BATTERY_CHANGED flg=0x60000000 (has
extras) }
11-11 17:39:31.496: I/ActivityManager(469): Displayed
com.leadsysdeve/.DrawNoshi: +8s19ms
11-11 17:39:32.089: I/ActivityManager(469): Starting: Intent
{ act=android.intent.action.VIEW dat=file:///sdcard/nscmp.jpg
typ=image/jpg cmp=epson.print/.ActivityViewImageSelect } from pid 1734
11-11 17:39:32.117: I/ActivityManager(469): Start proc epson.print for
activity epson.print/.ActivityViewImageSelect: pid=1777 uid=10143
gids={3003, 1015}
11-11 17:39:32.121: W/ActivityManager(469): Duplicate finish request
for HistoryRecord{40a96d20 com.leadsysdeve/.DrawNoshi}
11-11 17:39:32.214: I/System.out(1777): begin load epsonImage lib
11-11 17:39:32.214: I/System.out(1777): load epsonImage lib finish
11-11 17:39:33.128: I/ActivityManager(469): Displayed
epson.print/.ActivityViewImageSelect: +1s17ms
11-11 17:39:33.195: W/InputManagerService(469): Window already
focused, ignoring focus gain of:
com.android.internal.view.IInputMethodClient$Stub$Proxy@407bceb8
11-11 17:39:36.753: W/PowerManagerService(469): Timer 0x3->0x3|0x0

↑  LOGここまで  ↑




On 11月10日, 午後10:02, Hiroshi SAKURAI <an.olive.t...@gmail.com> wrote:
> 高橋さん
>
> 桜井です。
>
> > Cに関してはcontent://の指定の仕方が分かりません。
> > sdカード内のjpgファイを直接指定しているのであまり関係ないような気もしますが・・・・
>
> すみません、書き方がわかりにくかったですね。
>
> ギャラリーなどから画像を共有すると、EXTRA_STREAMに入っているURIは
> content://...
> という、画像DB内のエントリをさすURIになります。
> 当然元の画像ファイルはfile://としてSDなどに存在します。
>
> 普通画像を受けとることができるアプリは、content://でもfile://でも
> 受けとることができるように作ります。
>
> iprintソフトは、content://が渡されてくることを前提に作られていて、
> file://が渡されると誤動作するのではないか?
> というのが、"C"の意味でした。
>
> 試しにGhost commanderからiprintに共有すると同じように落ちたので、
> Cが怪しいかな、と思います。
>
> Hiroshi SAKURAI
>
> 2011/11/10 leadsystem <t-takaha...@leadinet.com>:
> >> > 11-09...
>
> もっと読む ≫

元木

unread,
Nov 11, 2011, 6:13:56 AM11/11/11
to android-g...@googlegroups.com
こんばんは、元木です。

putExtra()以外に、Uriを渡す方法があったんですね。
不正確な情報を展開してしまい、申し訳ございません。

私の端末でも、ご提示のコードで正常にiPrintを
呼び出せることを確認しました。
また、「アプリケーションを選択」ダイアログは表示されますが、
以下のコードだけでもiprintを呼び出せることも確認しました。

        Intent intent = new Intent();
        intent.setDataAndType(data_uri, "image/jpg");
        startActivity(intent);

"Intent.ACTION_VIEW"の有無は、画面下部の+/-ボタンの表示・非表示に
関係しているようですね。
Reply all
Reply to author
Forward
0 new messages