Выберите сохранение примитива данных в Android - PullRequest
0 голосов
/ 07 февраля 2020

Я пытаюсь сохранить некоторые массивы в приложении, чтобы использовать их на другой платформе (C ++), которые сериализуются. Я использую метод pick, чтобы позволить пользователю выбрать имя файла и каталог, но сначала я пытаюсь определить каталог root следующим образом, поскольку для обработки Create Document требуется Android 10, чтобы начать в правильном определенном каталоге :

'' '

     String a = getExternalStorageDirectory().getPath();

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {

            try {

                String public_dir = "sistemaderiegoandroid_arduino" + MyDocuments.fileSeparator;
                file = new File(a, public_dir);

                file.setWritable(true);

                    if (!file.mkdirs()) {

                        file.mkdir();

                    }
                    ;
                    DocumentsContract.createDocument(context.getContentResolver(), DocumentsContract.buildRootUri(MyDocuments.AUTORITY,MyDocuments.ROOT), DocumentsContract.Document.MIME_TYPE_DIR,MyDocuments.INITIALURI);
                    fileUri = DocumentsContract.buildDocumentUri(MyDocuments.AUTORITY,MyDocuments.INITIALURI);

                } catch (Exception e) {
                    errorMsg(MyDocuments.falloCrear + e.toString());
                }
        }else{
            file = new File(a);

            file.setWritable(true);
            };

            String StfileR = "arduino_data_resumen.bin";
            String StfileT = "arduino_data_tiempo.bin";
            String StfileH = "arduino_data_humedad.bin";
            String StfileL = "arduino_data_luz.bin";
       try{
            createFile(fileUri, StfileT, CREATE_FILE_T);
            createFile(fileUri, StfileL, CREATE_FILE_L);
            createFile(fileUri, StfileH, CREATE_FILE_H);
            createFile(fileUri, StfileR, CREATE_FILE_R);

        } catch (Exception e) {

            errorMsg(MyDocuments.falloCrear + e.toString());
        }
        try {

            allData.saveData(context);

        } catch (Exception e) {
            errorMsg(MyDocuments.falloGrabar + e.toString());
        }

private void createFile(Uri pickerInitialUri, String file_name, int result_option_Flag) {

    //DocumentsUI
    Intent intent = new Intent(ACTION_CREATE_DOCUMENT);
    intent.setType(MyDocuments.MINETYPE);
    intent.putExtra(Intent.EXTRA_TITLE, file_name);
    intent.putExtra(Intent.EXTRA_RETURN_RESULT, RESULT_OK);
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        intent.putExtra(DocumentsContract.EXTRA_INITIAL_URI, pickerInitialUri);
        intent.putExtra(Intent.EXTRA_RETURN_RESULT, RESULT_OK);
    }

    //    intent.putExtra(DocumentsContract.EXTRA_EXCLUDE_SELF,true);

    startActivityForResult(intent, result_option_Flag);


};

' ''

Разрешения в манифесте:

'' *

      <uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>         

     <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>         

    <uses-permission-sdk-23 android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>         

    <uses-permission-sdk-23 android:name="android.permission.READ_EXTERNAL_STORAGE"/>           

'' '

и поставщик:

' ''

    <provider       

     android:name="com.sistemaderiegoandroid_arduino.MyDocuments"        

    android:authorities="com.sistemaderiegoandroid_arduino.documents"          
    android:grantUriPermissions="true"        

    android:exported="true"        
    android:permission="android.permission.MANAGE_DOCUMENTS">         
     <intent-filter>        
    <action android:name="android.content.action.DOCUMENTS_PROVIDER" />         
    </intent-filter>        
    </provider>        

'' '

Для сохранения данных в файле я использую FileDescriptor с методом getContentResolver (). OpenFileDescriptor MODE_APPEND, это дает ParcelFileDescriptor, а с помощью метода getFileDescriptor () я создаю FileOuputStream следующим образом:

''

        FileDescriptor fdR = null;        

    parcelFileDescriptorL = getContentResolver().openFileDescriptor(fileNameL, "MODE_APPEND", null);
                fdL = parcelFileDescriptorL.getFileDescriptor();
                arduinoDataL = new FileOutputStream(fdL);
                serializatorDataL = new ObjectOutputStream(arduinoDataL);
                for (int i = 0; i < allData.arrayDatosLuz.length; i++) {

                    serializatorDataL.writeObject(allData.arrayDatosLuz[i]);

                    serializatorDataL.flush();

                    fdL.sync();

                }
                ;
                serializatorDataL.close();

'' '

Полный пакет находится здесь:

https://github.com/DarioLobos/sistemariego

Я добавил этот запрос о предоставлении разрешения, но В любом случае, телефон не запрашивает разрешения. Я сбрасываю, в диспетчере приложений телефона кеши ограничений и разрешений, во всяком случае не запрашиваю их при установке программы. Другие приложения не имеют проблем во время установки, и телефон запрашивает разрешения.

'' '

 int granted = PackageManager.PERMISSION_GRANTED;

    grantRequested =
            ContextCompat.checkSelfPermission(context, Manifest.permission.WRITE_EXTERNAL_STORAGE) != granted |
                    ContextCompat.checkSelfPermission(context, Manifest.permission.READ_EXTERNAL_STORAGE) != granted |
                    ContextCompat.checkSelfPermission(context, Manifest.permission.BLUETOOTH) != granted |
                    ContextCompat.checkSelfPermission(context, Manifest.permission.BLUETOOTH_ADMIN) != granted;

    if ((grantRequested)) {

        if ((ContextCompat.checkSelfPermission(context, Manifest.permission.WRITE_SETTINGS) != PackageManager.PERMISSION_GRANTED)) {

            final AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(context);
            alertDialogBuilder.setTitle(grantDialog).setMessage(R.string.requestWriteSetting);
            alertDialogBuilder.setCancelable(false)
                    .setPositiveButton("Ok", new DialogInterface.OnClickListener() {

                        public void onClick(DialogInterface dialog, int id) {
                            if (callBackFlag == 0) {
                                Intent intent = new Intent(Settings.ACTION_MANAGE_WRITE_SETTINGS);
                                startActivity(intent);
                                callBackFlag++;
                                int granted = PackageManager.PERMISSION_GRANTED;
                                if (ContextCompat.checkSelfPermission(context, Manifest.permission.WRITE_SETTINGS) == granted) {

                                    grantRequested =
                                            ContextCompat.checkSelfPermission(context, Manifest.permission.WRITE_EXTERNAL_STORAGE) != granted |
                                                    ContextCompat.checkSelfPermission(context, Manifest.permission.READ_EXTERNAL_STORAGE) != granted |
                                                    ContextCompat.checkSelfPermission(context, Manifest.permission.BLUETOOTH) != granted |
                                                    ContextCompat.checkSelfPermission(context, Manifest.permission.BLUETOOTH_ADMIN) != granted;
                                    if (grantRequested) {

                                        ActivityCompat.requestPermissions(MainActivity.this,
                                                new String[]{
                                                        Manifest.permission.WRITE_EXTERNAL_STORAGE,
                                                        Manifest.permission.READ_EXTERNAL_STORAGE,
                                                        Manifest.permission.BLUETOOTH,
                                                        Manifest.permission.BLUETOOTH_ADMIN}, RESULT_OK);


                                    } else {
                                        if (grantRequested) {

                                            final AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(context);
                                            alertDialogBuilder.setTitle(exit).setMessage(R.string.permitNotGranted);
                                            alertDialogBuilder.setCancelable(false)
                                                    .setPositiveButton("Ok", new DialogInterface.OnClickListener() {
                                                        public void onClick(DialogInterface dialog, int id) {

                                                            MainActivity.this.finish();
                                                            System.exit(0);
                                                        }
                                                    });


                                            AlertDialog alertDialog = alertDialogBuilder.create();
                                            alertDialog.show();

                                        }
                                    }
                                }
                            } else {
                                dialog.dismiss();

                                alertDialogBuilder.setTitle(exit).setMessage(R.string.permitNotGranted);
                                alertDialogBuilder.setCancelable(false)
                                        .setPositiveButton("Ok", new DialogInterface.OnClickListener() {
                                            public void onClick(DialogInterface dialog, int id) {

                                                MainActivity.this.finish();
                                                System.exit(0);
                                            }
                                        });


                                AlertDialog alertDialog = alertDialogBuilder.create();
                                alertDialog.show();

                            }
                        }

                    });

        }
    }
}


@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
    boolean grantChecker = false;


    if (grantResults.length > 0) {
        grantChecker = true;

        for (int i = 0; grantResults.length > i; i++) {
            boolean a = grantResults[i] == PackageManager.PERMISSION_GRANTED;
            grantChecker = grantChecker & a;
        }
    }

    if (requestCode != RESULT_OK) {

        int granted = PackageManager.PERMISSION_GRANTED;

        if (!grantChecker & (ContextCompat.checkSelfPermission(context, Manifest.permission.WRITE_SETTINGS) == granted)) {
            if (ActivityCompat.shouldShowRequestPermissionRationale(this,
                    Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
                ResumenFragment.errorMsg(permitHandling);
                ActivityCompat.requestPermissions(this,
                        new String[]{
                                Manifest.permission.WRITE_EXTERNAL_STORAGE,
                                Manifest.permission.READ_EXTERNAL_STORAGE,
                                Manifest.permission.BLUETOOTH,
                                Manifest.permission.BLUETOOTH_ADMIN}, RESULT_OK);

            } else {

                grantRequested =
                        ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != granted |
                                ContextCompat.checkSelfPermission(context, Manifest.permission.READ_EXTERNAL_STORAGE) != granted |
                                ContextCompat.checkSelfPermission(context, Manifest.permission.BLUETOOTH) != granted |
                                ContextCompat.checkSelfPermission(context, Manifest.permission.BLUETOOTH_ADMIN) != granted;

                if (grantRequested) {

                    final AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(context);


                    alertDialogBuilder.setTitle(exit).setMessage(R.string.permitNotGranted);
                    alertDialogBuilder.setCancelable(false)
                            .setPositiveButton("Ok", new DialogInterface.OnClickListener() {
                                public void onClick(DialogInterface dialog, int id) {

                                    MainActivity.this.finish();
                                    System.exit(0);
                                }
                            });


                    AlertDialog alertDialog = alertDialogBuilder.create();
                    alertDialog.show();

                }
                ;
            }

        }
    }

' '' Содержимое результата для OPENDOCUMENT и CREATEDOCUMENT содержит информацию о выбранный файл в переопределенном методе onActivityResult. Если с помощью intent.getData () получить URI для файла, то можно открыть с помощью contentResolver.openFileDescriptor и с помощью метода getFileDescriptor () сделать FileOutputStream или FileInputStream syn c. Как это:

'' '

    @Override
public void onActivityResult(int requestCode, int resultCode,
                             Intent resultData) {
    if (resultCode == Activity.RESULT_OK) {


        //           The result data contains a URI for the document or directory that
        //           the user selected.
        if (resultData != null) {

            Uri uriData = resultData.getData();
         //   String fileId =DocumentsContract.getDocumentId(uriData);



                    if (requestCode == CREATE_FILE_L) {
                        Data.fileNameL = uriData;
                    }
                    if (requestCode == CREATE_FILE_H) {
                        Data.fileNameH = uriData;
                    }
                    if (requestCode == CREATE_FILE_R) {
                        Data.fileNameR = uriData;
                    }
                    if (requestCode == CREATE_FILE_T) {
                        Data.fileNameR = uriData;
                    }

                    if (requestCode == PICK_FILE_T) {
                        Data.fileNameT = uriData;
                    }
                    if (requestCode == PICK_FILE_L) {
                        Data.fileNameL = uriData;
                    }
                    if (requestCode == PICK_FILE_H) {
                        Data.fileNameH = uriData;
                    }
                    if (requestCode == PICK_FILE_R) {
                        Data.fileNameR = uriData;

' ''

Я ДОЛЖЕН ЗНАТЬ ПРАВИЛЬНЫЙ СПОСОБ ОПРЕДЕЛЕНИЯ ROOT КАТАЛОГА И СКАЧИВАНИЯ КАТАЛОГА И НАИМЕНОВАНИЕ НАЗВАНИЯ И СПРАВОЧНИК, СОБРАННЫЕ ИЗ НАМЕРЕННОГО РЕЗУЛЬТАТА. Я сделал много испытаний без решения, любая помощь приветствуется.

...