OnActionItemClicked中出错

时间:2013-02-20 19:52:13

标签: android

我有一个非常奇怪的问题。我在使用SherlockActionBar时成功设置了Contextual Action Bar。当我选择一个动作模式按钮时,显示一个Toast消息正常。当我用我的方法调用saveRing()交换它时,我得到一个力量关闭。错误必须在我的saveRing()方法中,但我无法理解。当我从弹出的上下文菜单中调用它时,saveRing方法工作正常。

我的saveRing():

public boolean saveRing(int raw_resource, String title) {
        byte[] buffer = null;
        InputStream fIn = getBaseContext().getResources()
                .openRawResource(raw_resource);
        int size = 0;

        try {
            size = fIn.available();
            buffer = new byte[size];
            fIn.read(buffer);
            fIn.close();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            return false;
        }

        String path = "/sdcard/media/audio/ringtones/";
        String filename = title + ".mp3";

        boolean exists = (new File(path)).exists();
        if (!exists) {
            new File(path).mkdirs();
        }
        FileOutputStream save;
        try {
            save = new FileOutputStream(path + filename);
            save.write(buffer);
            save.flush();
            save.close();
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            return false;
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            return false;
        }
        sendBroadcast(
                new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri
                        .parse("file://" + path + filename)));

        File k = new File(path, filename);

        ContentValues values = new ContentValues();
        values.put(MediaStore.MediaColumns.DATA, k.getAbsolutePath());
        values.put(MediaStore.MediaColumns.TITLE, title);
        values.put(MediaStore.MediaColumns.MIME_TYPE, "audio/mp3");
        values.put(MediaStore.Audio.Media.ARTIST, "Epic Meal Time ");
        values.put(MediaStore.Audio.Media.IS_RINGTONE, true);
        values.put(MediaStore.Audio.Media.IS_NOTIFICATION, false);
        values.put(MediaStore.Audio.Media.IS_ALARM, false);
        values.put(MediaStore.Audio.Media.IS_MUSIC, false);

        Uri pURI = MediaStore.Audio.Media.getContentUriForPath(k
                .getAbsolutePath());

        // remove entry every time so we don't get duplicate entries and have a
        // problem setting a 2nd time
        getContentResolver().delete(
                pURI,
                MediaStore.MediaColumns.DATA + "=\"" + k.getAbsolutePath()
                        + "\"", null);

        Uri nURI = getContentResolver().insert(pURI,
                values);

        RingtoneManager.setActualDefaultRingtoneUri(this,
                RingtoneManager.TYPE_RINGTONE, nURI);
        Toast.makeText(this, title + " Ringtone set",
                Toast.LENGTH_LONG).show();

        return true;
    }

logcat的:

02-19 21:38:47.691: E/AndroidRuntime(20492): FATAL EXCEPTION: main
02-19 21:38:47.691: E/AndroidRuntime(20492): java.lang.NullPointerException
02-19 21:38:47.691: E/AndroidRuntime(20492):    at vartanian.android.epicmealtimepro.Tab3Fragment$mActionModeCallback.onActionItemClicked(Tab3Fragment.java:346)
02-19 21:38:47.691: E/AndroidRuntime(20492):    at com.actionbarsherlock.internal.ActionBarSherlockNative$ActionModeCallbackWrapper.onActionItemClicked(ActionBarSherlockNative.java:243)
02-19 21:38:47.691: E/AndroidRuntime(20492):    at com.android.internal.policy.impl.PhoneWindow$DecorView$ActionModeCallbackWrapper.onActionItemClicked(PhoneWindow.java:2552)
02-19 21:38:47.691: E/AndroidRuntime(20492):    at com.android.internal.app.ActionBarImpl$ActionModeImpl.onMenuItemSelected(ActionBarImpl.java:931)
02-19 21:38:47.691: E/AndroidRuntime(20492):    at com.android.internal.view.menu.MenuBuilder.dispatchMenuItemSelected(MenuBuilder.java:735)
02-19 21:38:47.691: E/AndroidRuntime(20492):    at com.android.internal.view.menu.MenuItemImpl.invoke(MenuItemImpl.java:149)
02-19 21:38:47.691: E/AndroidRuntime(20492):    at com.android.internal.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:874)
02-19 21:38:47.691: E/AndroidRuntime(20492):    at com.android.internal.view.menu.ActionMenuView.invokeItem(ActionMenuView.java:514)
02-19 21:38:47.691: E/AndroidRuntime(20492):    at com.android.internal.view.menu.ActionMenuItemView.onClick(ActionMenuItemView.java:99)
02-19 21:38:47.691: E/AndroidRuntime(20492):    at android.view.View.performClick(View.java:4091)
02-19 21:38:47.691: E/AndroidRuntime(20492):    at android.view.View$PerformClick.run(View.java:17036)
02-19 21:38:47.691: E/AndroidRuntime(20492):    at android.os.Handler.handleCallback(Handler.java:615)
02-19 21:38:47.691: E/AndroidRuntime(20492):    at android.os.Handler.dispatchMessage(Handler.java:92)
02-19 21:38:47.691: E/AndroidRuntime(20492):    at android.os.Looper.loop(Looper.java:137)
02-19 21:38:47.691: E/AndroidRuntime(20492):    at android.app.ActivityThread.main(ActivityThread.java:4962)
02-19 21:38:47.691: E/AndroidRuntime(20492):    at java.lang.reflect.Method.invokeNative(Native Method)
02-19 21:38:47.691: E/AndroidRuntime(20492):    at java.lang.reflect.Method.invoke(Method.java:511)
02-19 21:38:47.691: E/AndroidRuntime(20492):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789)
02-19 21:38:47.691: E/AndroidRuntime(20492):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:556)
02-19 21:38:47.691: E/AndroidRuntime(20492):    at dalvik.system.NativeStart.main(Native Method)
02-19 21:38:49.262: I/Process(20492): Sending signal. PID: 20492 SIG: 9

谢谢! 编辑:以下是第346行的代码:ma.saveRing(R.raw.quaq_language, values[2]);

具有错误的行取决于ListFragment中的哪个项调用CAB。我用这样的switch语句设置它:

case R.id.ringtone:
                switch (viewId) {
                case 0:
                    ma.saveRing(R.raw.ohhh_gurllll, values[0]);
                    break;
                case 1:
                    ma.saveRing(R.raw.pork_balls, values[1]);
                    break;

viewId是ListFragment中的位置。 问题似乎是值[]为空但我不知道为什么。这是它被初始化的地方:

public class Tab3Fragment extends SherlockListFragment {

    String[] values = new String[] { "Ohh Gurl", "Pork Balls", "Language",
            "Really Good Idea", "Rice Paper Bacon Condom",
            "Rise and Shine", "Roll One Up Homie",
            "Save The Hate For Twitter", "Snap, Crackle, Pop",
            "Let's Get Girls", "Spanish",
            "We Make Steak Look Like Cabbage", "Wake Up McDonalds",
            "Super Moist", "Stupid, Tasty Birds", "Bacon Moment",
            "Today We Eat Smart", "We Are Gonna Die On Youtube",
            "Drunk Off Pancakes", "Ketchup", "We Eat All Our Babies",
            "Maximum Meat Experience", "Stop Hating", "What Up Bitches",
            "Whatcha Know About Bullets",
            "Whatcha Know About Terrible Food", "CANADA", "Beiber Concert",
            "Ending Riceism", "You Ain't Got What We Got", "F*cking Noob",
            "Constructed Meat Base", "Want Some Of These Nuts" };

这是填充arrayadapter的字符串数组。

1 个答案:

答案 0 :(得分:0)

所以我终于明白了。我将getSherlockActivity()传递给了我的saveRing(),并在整个方法中使用了该上下文。我不确定为什么使用SherlockFragmentActivity上下文时出现问题,但这就是它的外观:

public boolean saveRing(int raw_resource, String title, Context context) {
        byte[] buffer = null;
        InputStream fIn = context.getResources()
                .openRawResource(raw_resource);
        int size = 0;

        try {
            size = fIn.available();
            buffer = new byte[size];
            fIn.read(buffer);
            fIn.close();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            return false;
        }

        String path = "/sdcard/media/audio/ringtones/";
        String filename = title + ".mp3";

        boolean exists = (new File(path)).exists();
        if (!exists) {
            new File(path).mkdirs();
        }
        FileOutputStream save;
        try {
            save = new FileOutputStream(path + filename);
            save.write(buffer);
            save.flush();
            save.close();
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            return false;
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            return false;
        }
        context.sendBroadcast(
                new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri
                        .parse("file://" + path + filename)));

        File k = new File(path, filename);

        ContentValues values = new ContentValues();
        values.put(MediaStore.MediaColumns.DATA, k.getAbsolutePath());
        values.put(MediaStore.MediaColumns.TITLE, title);
        values.put(MediaStore.MediaColumns.MIME_TYPE, "audio/mp3");
        values.put(MediaStore.Audio.Media.ARTIST, "Epic Meal Time ");
        values.put(MediaStore.Audio.Media.IS_RINGTONE, true);
        values.put(MediaStore.Audio.Media.IS_NOTIFICATION, false);
        values.put(MediaStore.Audio.Media.IS_ALARM, false);
        values.put(MediaStore.Audio.Media.IS_MUSIC, false);

        Uri pURI = MediaStore.Audio.Media.getContentUriForPath(k
                .getAbsolutePath());

        // remove entry every time so we don't get duplicate entries and have a
        // problem setting a 2nd time
        context.getContentResolver().delete(
                pURI,
                MediaStore.MediaColumns.DATA + "=\"" + k.getAbsolutePath()
                        + "\"", null);

        Uri nURI = context.getContentResolver().insert(pURI,
                values);

        RingtoneManager.setActualDefaultRingtoneUri(context,
                RingtoneManager.TYPE_RINGTONE, nURI);
        Toast.makeText(context, title + " Ringtone set",
                Toast.LENGTH_LONG).show();

        return true;
    }