0

私のダイアログには、ディレクトリ/sdcardとそのすべてのファイルが表示されます。ファイル/画像を選択すると、パスがビットマップ画像とともに保存されます。

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

ただし、ビットマップをクリックしてファイルを開こうとするたびに、自分のアプリケーションではなく、開いているアプリケーションがクラッシュします。

外部ストレージの書き込み権限を設定しました。以下に示すコード スニペット。何が問題なのか本当にわかりません。txtまた、pdf、 、などのすべてのファイル タイプを試しましたが、すべてファイルdocを開くアプリケーションがクラッシュし、ファイルが開かれませんでした。

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;

}

アクティビティ.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);
}

ログキャット

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 
4

1 に答える 1

1

だから私はこれを見つけました: https://stackoverflow.com/a/3677598/1704011答え

コメンターを引用するには:

2 つの個別の呼び出しの代わりに setDataAndType() を使用すると、問題が解決しました。

なぜそれが必要なのか、本当に混乱しました。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;
}

したがって、setTypeafterの呼び出しsetDataはデータを破壊し、 への呼び出しsetDataは型を破壊します。そのため、ギャラリー アプリが機能setTypesetDataなくなっています。インテントが送信されると、データは null になります。確かに、ドキュメントではこの動作について言及していますが、メソッド名に基づいて直感的ではなく、これらのメソッドの目的をより明確に伝えているようですsetTypeOnlysetDataOnlyそうしないと、これらの方法が相互に排他的であることが不明確になります。

を使用setDataAndType()して、問題を解決する必要があります。

于 2013-04-10T16:45:46.443 に答える