Вопрос

I'm developing the App that uses camera that allows user to capture photo and displays into GridView. It works fine till it saves the picture into App Specific folder But, when it is time to show them in a GridView, suddenly it crashes and give the Exception. I'm attaching the coding stuff and Logcat. However i tried to figure it out but i can't. Please Help!!

This is the class of camera:

public class OwnerAddPhoto extends Activity implements OnClickListener {

private Button btnAdd, btnUpload;
private GridView photoGrid;
ArrayList<String> filePath;
File[] listOfFile;
ImageAdapter getSDImgs;
private static final int PIC_FROM_CAMERA = 100;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.owner_photoupload);

    btnAdd = (Button) findViewById(R.id.btn_addphoto);
    btnUpload = (Button) findViewById(R.id.btn_uploadphoto);
    btnAdd.setOnClickListener(this);
    btnUpload.setOnClickListener(this);
}

@Override
public void onClick(View v) {

    switch (v.getId()) {

    case R.id.btn_addphoto:

        String state = Environment.getExternalStorageState();
        if (state.equals(Environment.MEDIA_MOUNTED)) {

            String root = Environment.getExternalStorageDirectory()
                    .toString();
            File DirHomey = new File(root, "/Homey");
            DirHomey.mkdirs();
            if (DirHomey.isDirectory()) {

                Log.d("Directory Available.", DirHomey.toString());
                Intent cameraIntent = new Intent(
                        MediaStore.ACTION_IMAGE_CAPTURE);
                Random rdm = new Random();
                int n = 1000;
                n = rdm.nextInt();

                String imgName = "IMG_" + n + ".jpg";
                File imgFile = new File(DirHomey, imgName);
                if (imgFile.exists()) {
                    imgFile.delete();
                }
                Log.d("Image File Created.", imgFile.toString());

                Uri extraFilePath = Uri.fromFile(imgFile);
                Log.d("IMGPath", extraFilePath.toString());
                cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT,
                        extraFilePath);
                startActivityForResult(cameraIntent, PIC_FROM_CAMERA);
            }

        }
        break;

    case R.id.btn_uploadphoto:

        break;
    }
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {

    if (resultCode != RESULT_CANCELED && requestCode == PIC_FROM_CAMERA
            && data != null) {

        getSDCARDImagePaths();
        getSDImgs = new ImageAdapter(this, filePath);
        photoGrid.setAdapter(getSDImgs);

    } else {
        Toast.makeText(this, "Ops.. Error Occurred! Try Again.",
                Toast.LENGTH_SHORT).show();
    }
    super.onActivityResult(requestCode, resultCode, data);
}

private void getSDCARDImagePaths() {

    filePath = new ArrayList<String>();
    File DirPath = new File(Environment.getExternalStorageDirectory(),
            "Homey");
    if (DirPath.isDirectory()) {

        listOfFile = DirPath.listFiles();
        for (int i = 0; i <= listOfFile.length; i++) {

            filePath.add(listOfFile[i].getAbsolutePath());

        }

    }
}

}

And This is LogCat Screen:

03-18 04:00:27.386: W/dalvikvm(1240): threadid=1: thread exiting with uncaught exception (group=0xb3aeeb90)
03-18 04:00:27.406: E/AndroidRuntime(1240): FATAL EXCEPTION: main
03-18 04:00:27.406: E/AndroidRuntime(1240): Process: com.example.homeyapp, PID: 1240
03-18 04:00:27.406: E/AndroidRuntime(1240): java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=100, result=-1, data=null} to activity {com.example.homeyapp/com.example.homeyapp.OwnerAddPhoto}: java.lang.ArrayIndexOutOfBoundsException: length=5; index=5
03-18 04:00:27.406: E/AndroidRuntime(1240):     at android.app.ActivityThread.deliverResults(ActivityThread.java:3346)
03-18 04:00:27.406: E/AndroidRuntime(1240):     at android.app.ActivityThread.handleSendResult(ActivityThread.java:3389)
03-18 04:00:27.406: E/AndroidRuntime(1240):     at android.app.ActivityThread.access$1200(ActivityThread.java:135)
03-18 04:00:27.406: E/AndroidRuntime(1240):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1445)
03-18 04:00:27.406: E/AndroidRuntime(1240):     at android.os.Handler.dispatchMessage(Handler.java:102)
03-18 04:00:27.406: E/AndroidRuntime(1240):     at android.os.Looper.loop(Looper.java:137)
03-18 04:00:27.406: E/AndroidRuntime(1240):     at android.app.ActivityThread.main(ActivityThread.java:4998)
03-18 04:00:27.406: E/AndroidRuntime(1240):     at java.lang.reflect.Method.invokeNative(Native Method)
03-18 04:00:27.406: E/AndroidRuntime(1240):     at java.lang.reflect.Method.invoke(Method.java:515)
03-18 04:00:27.406: E/AndroidRuntime(1240):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:777)
03-18 04:00:27.406: E/AndroidRuntime(1240):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:593)
03-18 04:00:27.406: E/AndroidRuntime(1240):     at dalvik.system.NativeStart.main(Native Method)
03-18 04:00:27.406: E/AndroidRuntime(1240): Caused by: java.lang.ArrayIndexOutOfBoundsException: length=5; index=5
03-18 04:00:27.406: E/AndroidRuntime(1240):     at com.example.homeyapp.OwnerAddPhoto.getSDCARDImagePaths(OwnerAddPhoto.java:117)
03-18 04:00:27.406: E/AndroidRuntime(1240):     at com.example.homeyapp.OwnerAddPhoto.onActivityResult(OwnerAddPhoto.java:96)
03-18 04:00:27.406: E/AndroidRuntime(1240):     at android.app.Activity.dispatchActivityResult(Activity.java:5435)
03-18 04:00:27.406: E/AndroidRuntime(1240):     at android.app.ActivityThread.deliverResults(ActivityThread.java:3342)
03-18 04:00:27.406: E/AndroidRuntime(1240):     ... 11 more
Это было полезно?

Решение

Remove = operator from i <= listOfFile.length; condition as below...

for (int i = 0; i < listOfFile.length; i++) {

        filePath.add(listOfFile[i].getAbsolutePath());

}

You can also solve the problem with i <= listOfFile.length-1; condition as below...

for (int i = 0; i <= listOfFile.length-1; i++) {

        filePath.add(listOfFile[i].getAbsolutePath());

}

So, your updated getSDCARDImagePaths() method will be...

private void getSDCARDImagePaths() {

    filePath = new ArrayList<String>();
    File DirPath = new File(Environment.getExternalStorageDirectory(),
            "Homey");
    if (DirPath.isDirectory()) {

        listOfFile = DirPath.listFiles();
        for (int i = 0; i < listOfFile.length; i++) {

            filePath.add(listOfFile[i].getAbsolutePath());

        }

    }
}

Другие советы

try this

private void getSDCARDImagePaths() {

    filePath = new ArrayList<String>();
    File DirPath = new File(Environment.getExternalStorageDirectory(),
            "Homey");
    if (DirPath.isDirectory()) {

        listOfFile = DirPath.listFiles();
        for (int i = 0; i < listOfFile.length; i++) {

            filePath.add(listOfFile[i].getAbsolutePath());

        }

    }
}
for (int i = 0; i <= listOfFile.length; i++) {

        filePath.add(listOfFile[i].getAbsolutePath());

}

should be

for (int i = 0; i < listOfFile.length; i++) {

        filePath.add(listOfFile[i].getAbsolutePath());

}

because your array is from size 0 to length - 1

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top