Невозможно сериализовать ArrayList <класс> с помощью Gson JAVA | ANDROID

Когда я нажимаю кнопку «добавить новый», приложение вылетает. Проблема в этой части кода:

    Boton cbt = new Boton(bt, "","");
    listBts.add(cbt);

    SharedPreferences sharedPreferences = getSharedPreferences("Array", MODE_PRIVATE);
    SharedPreferences.Editor editor = sharedPreferences.edit();

    Gson gson = new Gson();
    Type type = new TypeToken<BotonClass>() {
    }.getType();
    String json = gson.toJson(listBts);

    editor.remove("Botones").commit();
    editor.putString("Botones", json);
    editor.commit();

ВСЕ КОД:

public class MainActivity extends AppCompatActivity {

MediaPlayer mediaPlayer;
String Tag;
FlexboxLayout fl;
int w;
int h;
ImageView im;
Button curBt;
Boolean delete;
class Boton{
    Button bt;
    String path;
    String fname;
    Boton(Button bt, String path, String fname){
        this.bt = bt;
        this.path = path;
        this.fname = fname;
    }
}
ArrayList<Boton> listBts;
ArrayList<BotonClass> listClass;

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

    Chequear_Permisos();

    listBts = new ArrayList<>();
    listClass = new ArrayList<>();

    fl = findViewById(R.id.fl);
    DisplayMetrics dm = this.getResources().getDisplayMetrics();
    w = Math.round(dm.widthPixels);
    h = Math.round(dm.heightPixels);

    cargar_bts_agregados();

    im = findViewById(R.id.im);
    im.getLayoutParams().width = w;
    im.getLayoutParams().height = w/3;
}

void cargar_bts_agregados() {
    SharedPreferences sharedPreferences = getSharedPreferences("Array", MODE_PRIVATE);
    class Boton{
        Button bt;
        String path;
        String fname;
    }
    Type type = new TypeToken<List<Boton>>() {
    }.getType();
    String json = sharedPreferences.getString("Botones", "");
    Gson gson = new Gson();
    if (gson.fromJson(json,type)!= null)
        listBts = gson.fromJson(json, type);
    if (listBts != null)
        for (int i = 0; i < listBts.size(); i++) {
        }
}

void Chequear_Permisos(){
    if (ContextCompat.checkSelfPermission(MainActivity.this,
            Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED)
        ActivityCompat.requestPermissions(MainActivity.this, new String[] {Manifest.permission.READ_EXTERNAL_STORAGE}, 1);
    if (ContextCompat.checkSelfPermission(MainActivity.this,
            Manifest.permission.MANAGE_DOCUMENTS) != PackageManager.PERMISSION_GRANTED)
        ActivityCompat.requestPermissions(MainActivity.this, new String[] {Manifest.permission.MANAGE_DOCUMENTS}, 1);

}

void config_bt(Button bt, String path, String fname){
    bt.setOnLongClickListener(new View.OnLongClickListener() {
        @Override
        public boolean onLongClick(View v) {
            cargar_cancion(v);
            return true;
        }
    });
    bt.getLayoutParams().width = w/2;
    bt.getLayoutParams().height = (w/2)/2;
    if (fname != "")
        bt.setText(fname);
}

public void cargar_cancion(View v){
    Tag = v.getTag().toString();
    curBt = (Button)v;
    Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
    intent.setType("*/*");
    intent.addCategory(Intent.CATEGORY_OPENABLE);
    startActivityForResult(Intent.createChooser(intent,"Select file or dir"), 1);
    setResult(Activity.RESULT_OK);
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == 1 && resultCode == Activity.RESULT_OK) {
        class Boton{
            Button bt;
            String path;
            String fname;
        }
        String path = data.getDataString();
        String fname = getFileName(Uri.parse(path));
        curBt.setText(fname);
        Boton b = new Boton();
        /*
        b.bt = curBt;
        b.path = path;
        b.fname = fname;*/
        //////lb.get(curBt.getId()).path = path;
        //////lb.get(curBt.getId()).fname = fname;
        SharedPreferences sharedPreferences = getSharedPreferences("Array", MODE_PRIVATE);
        SharedPreferences.Editor editor = sharedPreferences.edit();
        Gson gson = new Gson();
        String json = gson.toJson(listBts);
        editor.putString("Botones", json);
        editor.commit();
    }

}

@RequiresApi(api = Build.VERSION_CODES.KITKAT)
public void play(View v){
    /*if (Integer.parseInt(v.getTag().toString()) > 8 && delete == true){
        String pos = v.getTag().toString();
        SharedPreferences shPaths = getSharedPreferences("Paths", MODE_PRIVATE);
        SharedPreferences.Editor editPath = shPaths.edit();
        SharedPreferences shBts = getSharedPreferences("BtNames", MODE_PRIVATE);
        SharedPreferences.Editor editorBts = shBts.edit();
        editPath.putString(pos, "deleted");
        editorBts.putString(pos, "deleted");
        editorBts.commit();
        editPath.commit();
        Log.d("MESAJE", v.getTag().toString());
        Log.d("MESAJE", shPaths.getString(String.valueOf(v.getTag().toString()), "_"));
        FlexboxLayout fl = findViewById(R.id.fl);
        fl.removeView(v);
        delete = false;
    }*/
    SharedPreferences sharedPreferences = getSharedPreferences("Paths", MODE_PRIVATE);
    String filePath = sharedPreferences.getString(v.getTag().toString(), "");
    Uri uri = Uri.parse(filePath);
    mediaPlayer = new MediaPlayer();
    try {
        mediaPlayer.setDataSource(getRealPathFromURI_API19(this, Uri.parse(filePath)));
        mediaPlayer.prepare();
        mediaPlayer.start();
        Button bt = (Button) v;
        bt.setText(getFileName(uri));
    } catch (IOException e) {
        e.printStackTrace();
        //Toast.makeText(this, e.getMessage(), Toast.LENGTH_LONG).show();
    }
    catch (Exception e){
        //Toast.makeText(this, e.getMessage(), Toast.LENGTH_LONG).show();
    }

}

public String getFileName(Uri uri) {
    String result = null;
    if (uri.getScheme().equals("content")) {
        Cursor cursor = getContentResolver().query(uri, null, null, null, null);
        try {
            if (cursor != null && cursor.moveToFirst()) {
                result = cursor.getString(cursor.getColumnIndex(OpenableColumns.DISPLAY_NAME));
            }
        } finally {
            cursor.close();
        }
    }
    if (result == null) {
        result = uri.getPath();
        int cut = result.lastIndexOf('/');
        if (cut != -1) {
            result = result.substring(cut + 1);
        }
    }
    return result;
}

@RequiresApi(api = Build.VERSION_CODES.KITKAT)
public static String getRealPathFromURI_API19(Context context, Uri uri) {
    String filePath = "";

    // ExternalStorageProvider
    if (isExternalStorageDocument(uri)) {
        final String docId = DocumentsContract.getDocumentId(uri);
        final String[] split = docId.split(":");
        final String type = split[0];

        if ("primary".equalsIgnoreCase(type)) {
            return Environment.getExternalStorageDirectory() + "/" + split[1];
        } else {

            if (Build.VERSION.SDK_INT > 20) {
                //getExternalMediaDirs() added in API 21
                File extenal[] = context.getExternalMediaDirs();
                if (extenal.length > 1) {
                    filePath = extenal[1].getAbsolutePath();
                    filePath = filePath.substring(0, filePath.indexOf("Android")) + split[1];
                }
            }else{
                filePath = "/storage/" + type + "/" + split[1];
            }
            return filePath;
        }

    } else if (isDownloadsDocument(uri)) {
        // DownloadsProvider
        final String id = DocumentsContract.getDocumentId(uri);
        //final Uri contentUri = ContentUris.withAppendedId(
        // Uri.parse("content://downloads/public_downloads"), Long.valueOf(id));

        Cursor cursor = null;
        final String column = "_data";
        final String[] projection = {column};

        try {
            cursor = context.getContentResolver().query(uri, projection, null, null, null);
            if (cursor != null && cursor.moveToFirst()) {
                final int index = cursor.getColumnIndexOrThrow(column);
                String result = cursor.getString(index);
                cursor.close();
                return result;
            }
        } finally {
            if (cursor != null)
                cursor.close();
        }
    } else if (DocumentsContract.isDocumentUri(context, uri)) {
        // MediaProvider
        String wholeID = DocumentsContract.getDocumentId(uri);

        // Split at colon, use second item in the array
        String[] ids = wholeID.split(":");
        String id;
        String type;
        if (ids.length > 1) {
            id = ids[1];
            type = ids[0];
        } else {
            id = ids[0];
            type = ids[0];
        }

        Uri contentUri = null;
        if ("image".equals(type)) {
            contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
        } else if ("video".equals(type)) {
            contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
        } else if ("audio".equals(type)) {
            contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
        }

        final String selection = "_id=?";
        final String[] selectionArgs = new String[]{id};
        final String column = "_data";
        final String[] projection = {column};
        Cursor cursor = context.getContentResolver().query(contentUri,
                projection, selection, selectionArgs, null);

        if (cursor != null) {
            int columnIndex = cursor.getColumnIndex(column);

            if (cursor.moveToFirst()) {
                filePath = cursor.getString(columnIndex);
            }
            cursor.close();
        }
        return filePath;
    } else {
        String[] proj = {MediaStore.Audio.Media.DATA};
        Cursor cursor = context.getContentResolver().query(uri, proj, null, null, null);
        if (cursor != null) {
            int column_index = cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DATA);
            if (cursor.moveToFirst())
                filePath = cursor.getString(column_index);
            cursor.close();
        }


        return filePath;
    }
    return null;
}

public static boolean isExternalStorageDocument(Uri uri) {
    return "com.android.externalstorage.documents".equals(uri.getAuthority());
}


public static boolean isDownloadsDocument(Uri uri) {
    return "com.android.providers.downloads.documents".equals(uri.getAuthority());
}

public void addnew(Button bt, String fname, String path) {
    fl.addView(bt);
    config_bt(bt, fname, path);
}

public void addnew(View v){
    if (listBts == null)
        Log.d("MESAJE", "MMMMMMM");
    final Button bt = new Button(this);
    bt.setText("Cargar");
    bt.setOnClickListener(new View.OnClickListener() {
        @RequiresApi(api = Build.VERSION_CODES.KITKAT)
        public void onClick(View v) {
            play(bt);
        }
    });
    bt.setTag(contar_bts());
    fl.addView(bt);

    /*
    BotonClass bbc = new BotonClass(bt, "","");
    listClass.add(bbc);
    listClass.get(0);
    cbt.bt = bt;
    cbt.path = "";
    cbt.fname = "";*/

    Boton cbt = new Boton(bt, "","");
    listBts.add(cbt);

    SharedPreferences sharedPreferences = getSharedPreferences("Array", MODE_PRIVATE);
    SharedPreferences.Editor editor = sharedPreferences.edit();

    Gson gson = new Gson();
    Type type = new TypeToken<BotonClass>() {
    }.getType();
    String json = gson.toJson(listBts);

    editor.remove("Botones").commit();
    editor.putString("Botones", json);
    editor.commit();

    config_bt(bt,"","");
}

public int contar_bts(){
    if (listBts == null || listBts.size() == 0)
        return 0;
    int c =Integer.parseInt(listBts.get(listBts.size()-1).bt.getTag().toString());
    return c;
}

public void Elimnar_bt(View v){
    delete = true;
}

}

Как насчет трассировки стека?

TheWanderer 19.09.2018 21:50

что это?????

Expand Mind 19.09.2018 21:54

Посмотрите на нижнюю часть экрана слева, найдите там, где написано Logcat. Будет показано console. Когда происходит сбой, вы должны увидеть исключение, за которым следует иерархия вызовов, которые привели к точке исключения.

Juan 19.09.2018 22:01

Также выполните Log.d () строки json, чтобы увидеть, как она сформирована.

Juan 19.09.2018 22:02

Ты говоришь по-ипански?

Expand Mind 19.09.2018 22:10

Exception_1 = java.lang.ClassNotFoundException: не удалось найти класс com.qualcomm.qti.Performance по пути: DexPathList [[], nativeLibraryDirectories = [/ system / lib, / vendor / lib]]

Expand Mind 19.09.2018 22:14
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
6
34
0

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