gpt4 book ai didi

java - 读取 Sdcard 上的文件时出错

转载 作者:行者123 更新时间:2023-12-01 14:41:14 27 4
gpt4 key购买 nike

我的对话框显示目录 /sdcard 及其所有文件。选择文件/图像后,路径将与位图图像一起保存,例如

file.name = "/sdcard/Pictures/Screenshots/Screenshot_2013-01-15-10-42-02.jpg";`

但是,每次我尝试通过单击位图打开文件时,都会导致打开的应用程序崩溃,而不是我的应用程序崩溃。

我已设置写入外部存储权限。代码 fragment 如下所示。我真的不知道出了什么问题。我还尝试了所有文件类型,例如txtpdfdoc等,所有这些都会导致打开文件应用程序崩溃,而不是打开文件。

Adapter.java(到位图)

public View getView(int position, View convertView, Viewgroup parent(){
case Image:
Bitmap bp = new BitmapFactory().decodeFile(file.name);
image.setImageBitmap(Bitmap.create(bp, 200, 200, true));
break;

}

Activity.java

public void onItemClick(AdapterView<?> parent, View v, int position, long id){
Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
intent.setData(Uri.fromFile(new File(file.name)));
intent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);

switch(file.getTypeByName()){
case Image:
intent.setType("image/*");
break;
}
startActivityforResult(intent, 000);
}

Logcat

04-10 12:04:42.164: E/AndroidRuntime(4513): FATAL EXCEPTION: main
04-10 12:04:42.164: E/AndroidRuntime(4513): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.android.sec.gallery3d/com.android.sec.gallery3d.app.Gallery}: java.lang.NullPointerException
04-10 12:04:42.164: E/AndroidRuntime(4513): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1968)
04-10 12:04:42.164: E/AndroidRuntime(4513): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1993)
04-10 12:04:42.164: E/AndroidRuntime(4513): at android.app.ActivityThread.access$600(ActivityThread.java:127)
04-10 12:04:42.164: E/AndroidRuntime(4513): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1159)
04-10 12:04:42.164: E/AndroidRuntime(4513): at android.os.Handler.dispatchMessage(Handler.java:99)
04-10 12:04:42.164: E/AndroidRuntime(4513): at android.os.Looper.loop(Looper.java:137)
04-10 12:04:42.164: E/AndroidRuntime(4513): at android.app.ActivityThread.main(ActivityThread.java:4512)
04-10 12:04:42.164: E/AndroidRuntime(4513): at java.lang.reflect.Method.invokeNative(Native Method)
04-10 12:04:42.164: E/AndroidRuntime(4513): at java.lang.reflect.Method.invoke(Method.java:511)
04-10 12:04:42.164: E/AndroidRuntime(4513): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:978)
04-10 12:04:42.164: E/AndroidRuntime(4513): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:745)
04-10 12:04:42.164: E/AndroidRuntime(4513): at dalvik.system.NativeStart.main(Native Method)
04-10 12:04:42.164: E/AndroidRuntime(4513): Caused by: java.lang.NullPointerException
04-10 12:04:42.164: E/AndroidRuntime(4513): at com.android.sec.gallery3d.app.Gallery.startViewAction(Gallery.java:377)
04-10 12:04:42.164: E/AndroidRuntime(4513): at com.android.sec.gallery3d.app.Gallery.initializeByIntent(Gallery.java:237)
04-10 12:04:42.164: E/AndroidRuntime(4513): at com.android.sec.gallery3d.app.Gallery.onCreate(Gallery.java:149)
04-10 12:04:42.164: E/AndroidRuntime(4513): at android.app.Activity.performCreate(Activity.java:4469)
04-10 12:04:42.164: E/AndroidRuntime(4513): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1052)
04-10 12:04:42.164: E/AndroidRuntime(4513): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1932)
04-10 12:04:42.164: E/AndroidRuntime(4513): ... 11 more
04-10 12:04:42.164: W/ActivityManager(668): Force finishing activity r.intent.getComponent().flattenToShortString()
04-10 12:04:42.234: E/android.os.Debug(668): !@Dumpstate > dumpstate -k -t -n -z -d -o /data/log/dumpstate_app_error
04-10 12:04:42.244: I/dumpstate(4530): begin

最佳答案

所以我发现了这个:https://stackoverflow.com/a/3677598/1704011回答

引用评论者的话:

using setDataAndType() instead of the 2 separate calls fixed her issue.

这真的让我很困惑为什么这是必要的。然后我查看了 Intent.setType()Intent.setData()Intent.setDataAndType() 的实现。看看这个:

public Intent setType(String type) {
mData = null;
mType = type;
return this;
}

public Intent setData(Uri data) {
mData = data;
mType = null;
return this;
}

因此,在 setData 之后调用 setType 会破坏数据,而对 setData 的调用也会破坏类型。这就是图库应用程序崩溃的原因,您在 setData 之后setType,因此当发送 Intent 时数据为空。授予 docs确实提到了这种行为,但根据方法名称来看它并不直观,像 setTypeOnlysetDataOnly 之类的东西似乎更明确地传达了这些方法的目的。否则不清楚这些方法是相互排斥的。

使用 setDataAndType() 应该可以解决您的问题。

关于java - 读取 Sdcard 上的文件时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15931371/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com