Wątek przeniesiony 2015-03-25 15:29 z Newbie przez furious programming.

Program źle kopiuje pliki z folderu raw na kartę sd

0

W buttonie mam taki kod:

                File file = new File(Environment.getExternalStorageDirectory(), "/audio/testowa");
                if (!file.exists())
                {
                    file.mkdirs();
                }

                String path = Environment.getExternalStorageDirectory()
                        .getAbsolutePath() + "/audio/testowa";

                File f = new File(path + "/", "nr1" + ".mp3");

                Uri mUri = Uri.parse("android.resource://"
                        + getApplicationContext().getPackageName() + "/raw/" + "nr1");
                ContentResolver mCr = getApplicationContext().getContentResolver();
                AssetFileDescriptor soundFile;
                try
                {
                    soundFile = mCr.openAssetFileDescriptor(mUri, "r");
                } catch (FileNotFoundException e)
                {
                    soundFile = null;
                }



                try
                {
                    byte[] readData = new byte[1024];
                    FileInputStream fis = soundFile.createInputStream();
                    FileOutputStream fos = new FileOutputStream(f);
                    int i = fis.read(readData);

                    while (i != -1)
                    {
                        fos.write(readData, 0, i);
                        i = fis.read(readData);
                    }

                    fos.close();
                } catch (IOException io)
                {
                }
                ContentValues values = new ContentValues();
                values.put(MediaStore.MediaColumns.DATA, f.getAbsolutePath());
                values.put(MediaStore.MediaColumns.TITLE, "nr1");
                values.put(MediaStore.MediaColumns.MIME_TYPE, "audio/mp3");
                values.put(MediaStore.MediaColumns.SIZE, f.length());
                values.put(MediaStore.Audio.Media.ARTIST, R.string.app_name);
                values.put(MediaStore.Audio.Media.IS_RINGTONE, true);
                values.put(MediaStore.Audio.Media.IS_NOTIFICATION, true);
                values.put(MediaStore.Audio.Media.IS_ALARM, true);
                values.put(MediaStore.Audio.Media.IS_MUSIC, true);

                Uri uri = MediaStore.Audio.Media.getContentUriForPath(f
                        .getAbsolutePath());
                Uri newUri = mCr.insert(uri, values);

                try
                {
                    RingtoneManager.setActualDefaultRingtoneUri(getApplicationContext(),
                            RingtoneManager.TYPE_RINGTONE, newUri);
                    Settings.System.putString(mCr, Settings.System.RINGTONE,
                            newUri.toString());
                } catch (Throwable t)
                {

                }

Po uruchomieniu emulatora i kliknięciu w Button, by wywołać ten kod, nie dzieje się to co chcę. Program zapisuje wybrany plik mp3 w zupełnie innej ścieżce, jakiejś wygenerowanej z cyferkami wieloma (coś w stylu /225423525/<unknown>/), nie wiem dlaczego. A skoro pod złą ścieżkę wrzuca plik, to tym samym nie ustawia dźwięku jako dzwonek.
Bardzo proszę kogoś by zerknął w kod i wskazał błąd, który odpowiada za zapisanie dźwięku w ścieżce zupełnie dziwnej, zamiast tej podanej w kodzie.

0

A posiadasz w AndroidManifest.xml Permission WRITE_EXTERNAL_STORAGE ?

0

tak, mam te uprawnienia dodane

0

Przebudowałem trochę Twój kod(tylko i wyłącznie samo kopiowanie, bez udostępniania danych dla MediaStorage). Uruchomiłem to na Android 4.4.2 i zadziałało. Podejrzewam, że w Twoim przykładzie brakło ścieżki do Music. Ponieważ

Environment.getExternalStorageDirectory()

zwraca ścieżkę
/storage/emulated/0

Tutaj jest kawałek kodu, który u mnie zadziałał więc u Ciebie też powinno bez problemu.

        String pathToSdCard = Environment.getExternalStorageDirectory() + "/Music/Test";
        File file = new File(Environment.getExternalStorageDirectory() + "/Music/Test");
        int rawFilePath = R.raw.alert;
        
        if (!file.exists()) {
            Log.d("PATH", "!EXIST");
            file.mkdirs();
        }


        try {
            byte[] readData = new byte[1024];
            InputStream fis = getResources().openRawResource(rawFilePath);
            FileOutputStream fos = new FileOutputStream(pathToSdCard+"/alert.ogg");
            int i = fis.read(readData);

            while (i != -1) {
                fos.write(readData, 0, i);
                i = fis.read(readData);
            }

            fos.close();
        } catch (IOException io) {
            io.printStackTrace();
        }

I tak BTW jakbyś sobie wyrzucił tego IOExcepion'a na stack to byś się domyślił :D

0

@panryz Dziękuję, że czas swój poświęciłeś i kod przerobiłeś. Szkoda, że u mnie nie działa poprawnie. Skopiowałem twój kod, odpaliłem, nadal plik zapisuje się pod niewłaściwą ścieżką, a dodatkowo z funkcją zapisu coś nie tak jest u mnie, bo plik jakby istnieje, ale nie do końca, nie da się go uruchomić nawet, jest na szaro. Nie wiem skąd te wszystkie problemy, podobno u ciebie nie ma problemów, a u mnie niestety są. Ty sprawdzałeś wszystko na smartfonie czy w emulatorze? Bo ja tylko w emulatorze odpalałem.

0

Ja smartphone z Androidem 4.4.2 który ma dodatkowe obostrzenia co do manipulowania pamięcią.

1 użytkowników online, w tym zalogowanych: 0, gości: 1