Android 如何使用adb外壳显示本地图像

Android 如何使用adb外壳显示本地图像,android,adb,Android,Adb,我想使用adb shell告诉我的设备在SD卡上显示图像。我认为这个命令会起作用: adb shell am start -a android.intent.action.MAIN -n com.android.browser/.BrowserActivity -d file:///storage/sdcard0/Android/data/<mypackage>/files/myfile.jpg 仅使用-d参数会导致此错误(我尝试在路径上使用或不使用“file://”前缀): 开始

我想使用
adb shell
告诉我的设备在SD卡上显示图像。我认为这个命令会起作用:

adb shell am start -a android.intent.action.MAIN -n com.android.browser/.BrowserActivity -d file:///storage/sdcard0/Android/data/<mypackage>/files/myfile.jpg
仅使用
-d
参数会导致此错误(我尝试在路径上使用或不使用“file://”前缀):

开始:Intent{act=android.Intent.action.VIEW dat=/storage/sdcard0/Android/data//files/myfile.jpg }
错误:活动未启动,无法解析意图{ act=android.intent.action.VIEW dat=/storage/sdcard0/Android/data//files/myfile.jpg flg=0x10000000}

对该文件的权限为:

-rw-rw-r-- root     sdcard_rw   198106 2013-01-02 21:29 gUD9w5.jpg
我正在测试运行4.1.1的根Galaxy Nexus

更新:我尝试了米拉诺的建议,但裁剪工具弹出了一个“无法加载图像”的弹出窗口。来自logcat的堆栈跟踪是:

ActivityManager: START {dat=file:///storage/sdcard0/Android/data/<mypackage>/Pictures/myfile.jpg typ=image/* 
    flg=0x13000000 cmp=com.google.android.gallery3d/com.android.gallery3d.app.CropImage u=0} from pid 301
UriImage: fail to open: file:///storage/sdcard0/Android/data/<mypackage>/Pictures/myfile.jpg
UriImage: java.io.FileNotFoundException: /storage/sdcard0/Android/data/<mypackage>/Pictures/myfile.jpg: 
    open failed: ENOENT (No such file or directory)
UriImage:   at libcore.io.IoBridge.open(IoBridge.java:416)
UriImage:   at java.io.FileInputStream.<init>(FileInputStream.java:78)
UriImage:   at java.io.FileInputStream.<init>(FileInputStream.java:105)
UriImage:   at android.content.ContentResolver.openInputStream(ContentResolver.java:445)
UriImage:   at com.android.gallery3d.data.UriImage.openOrDownloadInner(UriImage.java:98)
UriImage:   at com.android.gallery3d.data.UriImage.openFileOrDownloadTempFile(UriImage.java:78)
UriImage:   at com.android.gallery3d.data.UriImage.prepareInputFile(UriImage.java:164)
UriImage:   at com.android.gallery3d.data.UriImage.access$100(UriImage.java:40)
UriImage:   at com.android.gallery3d.data.UriImage$RegionDecoderJob.run(UriImage.java:170)
UriImage:   at com.android.gallery3d.data.UriImage$RegionDecoderJob.run(UriImage.java:168)
UriImage:   at com.android.gallery3d.app.CropImage$LoadDataTask.run(CropImage.java:921)
UriImage:   at com.android.gallery3d.app.CropImage$LoadDataTask.run(CropImage.java:913)
UriImage:   at com.android.gallery3d.util.ThreadPool$Worker.run(ThreadPool.java:124)
UriImage:   at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
UriImage:   at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
UriImage:   at java.lang.Thread.run(Thread.java:856)
UriImage:   at com.android.gallery3d.util.PriorityThreadFactory$1.run(PriorityThreadFactory.java:43)
UriImage: Caused by: libcore.io.ErrnoException: open failed: ENOENT (No such file or directory)
UriImage:   at libcore.io.Posix.open(Native Method)
UriImage:   at libcore.io.BlockGuardOs.open(BlockGuardOs.java:110)
UriImage:   at libcore.io.IoBridge.open(IoBridge.java:400)
UriImage:   ... 16 more
ActivityManager:启动{dat=file:///storage/sdcard0/Android/data//Pictures/myfile.jpg 类型=图像/*
flg=0x13000000 cmp=com.google.android.gallery3d/com.android.gallery3d.app.CropImage u=0}来自pid 301
UriImage:无法打开:file:///storage/sdcard0/Android/data//Pictures/myfile.jpg
UriImage:java.io.FileNotFoundException:/storage/sdcard0/Android/data//Pictures/myfile.jpg:
打开失败:enoint(没有这样的文件或目录)
UriImage:at libcore.io.IoBridge.open(IoBridge.java:416)
UriImage:at java.io.FileInputStream。(FileInputStream.java:78)
UriImage:at java.io.FileInputStream。(FileInputStream.java:105)
UriImage:at-android.content.ContentResolver.openInputStream(ContentResolver.java:445)
UriImage:com.android.gallery3d.data.UriImage.openOrDownloadInner(UriImage.java:98)
UriImage:com.android.gallery3d.data.UriImage.openFileOrDownloadTempFile(UriImage.java:78)
UriImage:com.android.gallery3d.data.UriImage.prepareInputFile(UriImage.java:164)
UriImage:com.android.gallery3d.data.UriImage.access$100(UriImage.java:40)
UriImage:com.android.gallery3d.data.UriImage$RegionCoderJob.run(UriImage.java:170)
UriImage:com.android.gallery3d.data.UriImage$RegionCoderJob.run(UriImage.java:168)
UriImage:com.android.gallery3d.app.CropImage$LoadDataTask.run(CropImage.java:921)
UriImage:com.android.gallery3d.app.CropImage$LoadDataTask.run(CropImage.java:913)
UriImage:com.android.gallery3d.util.ThreadPool$Worker.run(ThreadPool.java:124)
UriImage:at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
UriImage:at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
UriImage:at java.lang.Thread.run(Thread.java:856)
UriImage:com.android.gallery3d.util.PriorityThreadFactory$1.run(PriorityThreadFactory.java:43)
UriImage:由以下原因引起:libcore.io.ErrnoException:打开失败:enoint(没有此类文件或目录)
UriImage:位于libcore.io.Posix.open(本机方法)
UriImage:at libcore.io.BlockGuardOs.open(BlockGuardOs.java:110)
UriImage:at libcore.io.IoBridge.open(IoBridge.java:400)
UriImage:。。。还有16个

我想知道这是否是一个内部SD卡,可能图像被视为应用程序数据,因此其他应用程序无法访问它?

我的要求的最快解决方法是将文件从设备中取出,并在本地计算机上测试它:

adb pull /storage/sdcard0/Android/data/<mypackage>/files/myfile.jpg ~/Downloads
adb pull/storage/sdcard0/Android/data//files/myfile.jpg~/下载

这应该可以工作,但这取决于您安装的应用程序:

$ adb shell am start -t image/* -d file:///mnt/sdcard/myfile.jpg
有趣的是,如果您在中选择Gallery并使用…完成操作,它将不起作用,但如果您选择裁剪图片,它将起作用。
还可与Astro Image Viewer配合使用

它应与查看配合使用,并关闭
-n com.android.browser/.browser活动
。然后,系统应将意图解析为正确的类。这似乎对我不起作用,我已使用看到的错误更新了问题。安装文件管理器应用程序并尝试使用该应用程序浏览和查看-应回答权限问题。可能该文件是可访问的,但不是通过app userid的路径名。对我来说有效的是Kitkat 4.4.4
adb shell am start-a android.intent.action.VIEW-dfile:///storage/emulated/0/Download/foo.jpg -t image/jpeg
。米拉诺的回答出于某种原因在文档中打开了它。我可以看到“使用…完成操作”弹出窗口,但它总是说“无法加载图像”。问题可能是我的路径格式(我试过很多次),或者如果这是一个内部SD卡,那么可能是权限阻止了其他应用程序访问该文件。首先将图像文件添加到SD卡的根目录,然后验证该文件是否有效。然后转到另一个位置。在根目录下启动文件会起作用,因此我猜这是一个权限问题。请注意,如果您明确添加如下所述的查看操作,则Gallery会起作用:
$ adb shell am start -t image/* -d file:///mnt/sdcard/myfile.jpg