(开发)打开文件失败(LaunchFileAsync)可能是什么原因?

zcxsythenew UID.911687
2016-04-02 发表

本帖最后由 zcxsythenew 于 2016-4-2 22:53 编辑

生成的软件包,需要时使用:
***链接停止解析***
***链接停止解析***
***链接停止解析***

[hr]

我最近又遇到问题了……
而且再次出现了电脑和手机表现不一致的情况!(这真是令人尴尬)(说好的大统一呢)

异常表现:

首先,这是我的 APP 的某一页的内容
***附件停止解析***

在导航到这一页时,OnNavigatedTo 会执行读取文件操作:

[mw_shl_code=csharp,true]//StorageFolder filesFolder, filesCacheFolder; 和 object apm; 定义在全局变量中
//filesFolder 存储高清原图,filesCacheFolder 存储略缩图,横向200px,纵向由原图纵横比决定,每张约107KB
//AddedPhotosManager 是我自己写的一个类

apm = e.Parameter;

filesFolder = await ApplicationData.Current.LocalFolder.CreateFolderAsync("photos", CreationCollisionOption.OpenIfExists);
filesCacheFolder = await ApplicationData.Current.LocalFolder.CreateFolderAsync("photosCache", CreationCollisionOption.OpenIfExists);

//传递参数是空的代表未加载过
if (apm == null)
{
apm = new AddedPhotosManager();
IReadOnlyList<StorageFile> fileOL = await filesFolder.GetFilesAsync();
IReadOnlyList<StorageFile> fileCacheOL = await filesCacheFolder.GetFilesAsync();
string sum = fileOL.Count.ToString();
Image im, im2;
for (int i = 0; i < fileOL.Count; i++)
{
//粗暴的文字提示
progressText.Text = "即将完成(" + (i + 1).ToString() + "/" + sum + ")\n在此应用关闭前仅加载一次,除非你在此期间使用共享或文件关联的方式添加了新的图片。";

//在全局变量的 List 中添加文件以便接下来的管理(主要是“删除”)
((AddedPhotosManager)apm).filesList.Add(fileOL);
((AddedPhotosManager)apm).filesCacheList.Add(fileCacheOL);

//根据 107 KB 的缩略图从 StorageFile 生成 Image
im = await AddedPhotosManager.getImage(fileCacheOL);

//也添加到全局变量中以便在页面导航时传递该变量,实现“在此应用关闭前仅加载一次”
((AddedPhotosManager)apm).imagesList.Add(im);

//另生成一个新的 Image 以便重复添加到 GridView 中
im2 = new Image();
im2.Height = im.Height;
im2.Width = im.Width;
im2.Source = im.Source;
im2.Stretch = Stretch.UniformToFill;
photosGridView.Items.Add(im2);

selectAllAppBarButton.Visibility = Visibility.Visible;
}
}

//已加载过图片
else
{
Image i2;
foreach (Image i in ((AddedPhotosManager)apm).imagesList)
{
i2 = new Image();
i2.Height = i.Height;
i2.Width = i.Width;
i2.Source = i.Source;
i2.Stretch = Stretch.UniformToFill;
photosGridView.Items.Add(i2);
selectAllAppBarButton.Visibility = Visibility.Visible;
}
}
[/mw_shl_code]

这些文件点击“打开”的时候都是正常的。文件信息里显示的文件夹也正常。

[mw_shl_code=csharp,true]bool x = await Launcher.LaunchFileAsync(((AddedPhotosManager)apm).filesList[photosGridView.SelectedIndex]);

//如果打开失败
if (!x)
{
//launchFailed是一个做得很像 MessageDialogue 的 Flyout
launchFailedStackPanel.Width = mainGrid.ActualWidth - 44; //将其拉伸到与应用窗口一样宽
launchFailed.ShowAt(Frame);
}[/mw_shl_code]

***附件停止解析***

点击右下角的“+”,添加图片:

[mw_shl_code=csharp,true]FileOpenPicker picker = new FileOpenPicker();
picker.CommitButtonText = "添加";
picker.SuggestedStartLocation = PickerLocationId.PicturesLibrary;
picker.ViewMode = PickerViewMode.Thumbnail;
picker.FileTypeFilter.Add(".jpg");
picker.FileTypeFilter.Add(".jpeg");
picker.FileTypeFilter.Add(".png");
StorageFile file2, file3;
Image i, i2;

IReadOnlyList<StorageFile> flist = await picker.PickMultipleFilesAsync();

int x = 0;
string sum = flist.Count.ToString();
foreach (StorageFile file in flist)
{
//粗暴的文字提示
x++;
progressText.Text = "正在复制并缓存第" + x.ToString() + "张图片(共"+ sum +")…\n这可能需要较长时间。";

//复制此文件到应用本地文件夹
//fileDisplayName是int变量,其作用是当用户保存第一张图片时命名为0.jpg/.jpeg/.png,第二张图片时命名为1.jpg/.jpeg/.png,以此类推。我省略了与其有关的保存/读取代码。
file2 = await file.CopyAsync(filesFolder, fileDisplayName.ToString() + file.FileType);

//添加到全局变量的 List 里面
((AddedPhotosManager)apm).filesList.Add(file2);

//获取缩略图并同时保存,详细代码在下一个框内
file3 = await AddedPhotosManager.getThumbNail(file2);

((AddedPhotosManager)apm).filesCacheList.Add(file3);
i = await AddedPhotosManager.getImage(file3);
((AddedPhotosManager)apm).imagesList.Add(i);
i2 = new Image();
i2.Height = i.Height;
i2.Width = i.Width;
i2.Source = i.Source;
i2.Stretch = Stretch.UniformToFill;
photosGridView.Items.Add(i2);
selectAllAppBarButton.Visibility = Visibility.Visible;
selectAllAppBarButton.IsChecked = false;
fileDisplayName++;
}[/mw_shl_code]

[mw_shl_code=csharp,true]internal static async Task<StorageFile> getThumbNail(StorageFile file)
{
StorageFolder cacheFolder = await ApplicationData.Current.LocalFolder.CreateFolderAsync("photosCache", CreationCollisionOption.OpenIfExists);
ImageProperties x = await file.Properties.GetImagePropertiesAsync();
uint lim = 0;

//将其横向像素设置为 200
if (x.Height < x.Width)
{
lim = 200;
}
else
{
lim = 200 * x.Height / x.Width;
}

StorageItemThumbnail c = await file.GetThumbnailAsync(ThumbnailMode.PicturesView, lim, ThumbnailOptions.ResizeThumbnail);
Windows.Storage.Streams.Buffer buf = new Windows.Storage.Streams.Buffer(Convert.ToUInt32(c.Size));
IBuffer ibu = await c.ReadAsync(buf, buf.Capacity, InputStreamOptions.None);

//保存到 filesCacheFolder 并返回该文件
StorageFile f = await cacheFolder.CreateFileAsync(file.Name, CreationCollisionOption.ReplaceExisting);
using (IRandomAccessStream strm = await f.OpenAsync(FileAccessMode.ReadWrite, StorageOpenOptions.None))
{
await strm.WriteAsync(ibu);
}
return f;
}[/mw_shl_code]

此文件在电脑上正常打开,并且左侧显示的文件夹路径也正常,说明 StorageFile 应该没搞错,没把用户本来的文件错误地当成应用本地的文件。(我曾经怀疑是不是把 file 而不是 file2 添加到 List 里了。)但是在手机上不能打开。

***附件停止解析***

这篇帖子的代码比较多,主要是因为我不知道问题出在哪里,再加上电脑和手机的不一致,以及 LaunchFileAsync 只返回 false 都不肯 throw 一个详细的 Exception 出来,我根本就没有办法找到问题出现在哪里。

帖子开头有安装包,如有需要可以使用。

悬赏50(未解决)。***链接停止解析***

MSDN 官方解释:

Quote此 API 也对它可生成的文件类型有若干限制。很多包含可执行代码的文件类型,例如 .exe、.msi 和 .js 文件,在启动时都被阻止。恶意文件会修改系统,此限制可保护用户免受可能存在的恶意文件的危害。


可是我 Launch 的都是一些 png,jpg,jpeg 这些人畜无害的文件啊,这是什么原因?

标签: false 开发 用户 false

敬告:
为防止不可控的内容风险,本站已关闭新用户注册,新贴的发表及评论;
你现在看到的内容只是互联网用户曾经发表的言论快照,仅用于老用户留存纪念,且仅与科技行业相关,全部内容不代表本站观点及立场;
本站重新开放前已针对包括用户隐私、版权保护、信息安全、国家政策在内的各种互联网法律法规要求,执行了隐患内容的自查、屏蔽和删除;
本站目前所属个人主体,未有任何盈利安排与计划,且与原WFUN.COM所属公司不存在任何关联关系;
如果本帖内容或者相关资源侵犯到您的合法权益,或者您认为存在问题,那么请您务必点此举报或投诉!
全部回复:
wcavell UID.34926
2016-04-02 回复

本帖最后由 wcavell 于 2016-4-2 23:15 编辑

你在手机上用“文件管理器”能否打开图片(并不是在“照片”APP上打开)。

我这么问是因为以前我手机不知道是啥问题,发现mp4文件都不能打开,可能是那个文件关联出问题,然后发现全部的文件都不能打开。重置才能解决问题

zcxsythenew UID.911687
2016-04-02 回复

Quotewcavell 发表于 2016-4-2 23:11
你在手机上用“文件管理器”能否打开图片(并不是在“照片”APP上打开)。 ...


文件管理器是肯定没问题的。
重启应用之后,原本不能打开的文件也可以打开了。

zcxsythenew UID.911687
2016-04-02 使用 Lumia 1320 回复

Quotewcavell 发表于 2016-4-2 23:11
你在手机上用“文件管理器”能否打开图片(并不是在“照片”APP上打开)。

我这么问是因为以前我手机不知 ...


如果你愿意的话,帖子开头有安装包,你可以看看在你的手机上有没有这个问题。

MICHAEL~EDDY UID.934116
2016-04-03 使用 Lumia 640 回复

配置文件你确定都设置好了?

zcxsythenew UID.911687
2016-04-03 使用 Lumia 1320 回复

QuoteMICHAEL~EDDY 发表于 2016-4-3 00:08
配置文件你确定都设置好了?


什么配置文件?appxmanifest 还是别的什么?

MICHAEL~EDDY UID.934116
2016-04-03 使用 Lumia 640 回复

Quotezcxsythenew 发表于 2016-4-3 00:09
什么配置文件?appxmanifest 还是别的什么?


是的,文件关联文件打开这些你确定设置好了?

zcxsythenew UID.911687
2016-04-03 使用 Lumia 1320 回复

本帖最后由 zcxsythenew 于 2016-4-3 00:19 编辑

QuoteMICHAEL~EDDY 发表于 2016-4-3 00:11
是的,文件关联文件打开这些你确定设置好了?


1. 文件选取器和 LaunchFileAsync 不需要设置文件关联。
2. 设置文件关联是有风险的,一旦设置了文件关联,那么 LaunchFileAsync 有可能 Launch 回 App 本身,这并不是我想要的结果。我想要 Launch 用户的默认照片应用,比如自带的照片,或者 ACDSEE ,甚至 PhotoShop 等。

MICHAEL~EDDY UID.934116
2016-04-03 使用 Lumia 640 回复

Quotezcxsythenew 发表于 2016-4-3 00:18
1. 文件选取器和 LaunchFileAsync 不需要设置文件关联。
2. 设置文件关联是有风险的,一旦设置了文件关联 ...


{:6_217:}那就不清楚了,最好是调试的时候一步一步进行,看看哪里有人

zcxsythenew UID.911687
2016-04-03 使用 Lumia 1320 回复

QuoteMICHAEL~EDDY 发表于 2016-4-3 00:25
那就不清楚了,最好是调试的时候一步一步进行,看看哪里有人


代码就一句

bool x = await Launcher.LaunchFileAsync(((AddedPhotosManager)apm).filesList<photosGridView.SelectedIndex>);

结果就是 x == false,然后什么也没 Launch 出来。

而且电脑正常手机不正常。

我现在在想会不会是因为对文件进行了什么 Stream 之类的读取,可是 Launch 的文件只进行了被 Copy 产生和 GetThumbNails 两个操作,也不会有未关闭的情况。而且“删除”功能正常运行。

苍天啊!我上哪调试去啊!

MICHAEL~EDDY UID.934116
2016-04-03 使用 Lumia 640 回复

Quotezcxsythenew 发表于 2016-4-3 00:30
代码就一句

bool x = await Launcher.LaunchFileAsync(((AddedPhotosManager)apm).filesList);


{:6_218:}我都知道你用的那个方法是用来干嘛的

zcxsythenew UID.911687
2016-04-03 使用 Lumia 1320 回复

QuoteMICHAEL~EDDY 发表于 2016-4-3 00:39
我都知道你用的那个方法是用来干嘛的


“我都知道”还是“我都不知道”?读起来好奇怪。

帖子最前面有安装包。安装完也许就知道了。

MICHAEL~EDDY UID.934116
2016-04-03 使用 Lumia 640 回复

Quotezcxsythenew 发表于 2016-4-3 01:09
“我都知道”还是“我都不知道”?读起来好奇怪。

帖子最前面有安装包。安装完也许就知道了。 ...


不知道,打错了。但是安装包调试不了啊。。。

zcxsythenew UID.911687
2016-04-03 使用 Lumia 1320 回复

QuoteMICHAEL~EDDY 发表于 2016-4-3 01:22
不知道,打错了。但是安装包调试不了啊。。。


不用调试,帮我看看添加文件之后能不能打开就行。我看看是不是我手机的个别状况。

MICHAEL~EDDY UID.934116
2016-04-03 使用 Lumia 640 回复

Quotezcxsythenew 发表于 2016-4-3 01:32
不用调试,帮我看看添加文件之后能不能打开就行。我看看是不是我手机的个别状况。 ...


{:6_232:}不说清楚

tmp00000 UID.995403
2016-04-06 回复

手机上的Bug不止这些。你新建一个空白文件,拓展名是 .vb 。然后放到手机里,用文件资源管理器点。它会告诉你“出现问题,无法启动此文件”,而不是“要在应用商店搜索应用吗?”

本站使用Golang构建,点击此处申请开源鄂ICP备18029942号-4联系站长投诉/举报