Kirjoittaja Aihe: [Ratkaistu]Kuinka ulos Android studion emulaattorin hiekkalaatikosta ?  (Luettu 6174 kertaa)

kamara

  • Käyttäjä
  • Viestejä: 3032
    • Profiili
Olen pari päivää tapellut Android-studion tiedostojärjestelmän kanssa, ja enkä vieläkään ole löytänyt keinoa, kuinka päästä sen Android-emulaattorin hiekkalaatikosta.

Liitteenä kuvat Android-emulaattorista sen tiedostoselaimesta ja omasta koodistani...

Manifesti on seuraava...
Koodia: [Valitse]
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="net.myhello.www.myapplication2">

    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

Ja testikoodi...
Koodia: [Valitse]
package net.myhello.www.myapplication2;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
import java.io.File;
import java.io.FileFilter;
//import java.io.FilenameFilter;
import android.os.Environment;

import static android.R.attr.path;


public class MainActivity extends AppCompatActivity implements OnClickListener {

    private Button myButton = null;
    private TextView myTextView = null;



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

        this.myButton = (Button) findViewById(R.id.button);
        myButton.setText("Muuta buttonin teksti2ä");
        //Activity btnact = (Activity) new MyButtonActivity();//savedInstanceState);
        myTextView = (TextView)findViewById(R.id.textview);
        myTextView.setText("Pitää yrittää muuttaa tekstiä.\nTuleeko toinenkin rivi?");
        myButton.setOnClickListener(this);
    }

    public void onClick(View v) {
        File f = null;
        String s="";
        int i=0;
        FileFilter filter = new FileFilter() {
            @Override
            public boolean accept(File pathname) {
                return true;//pathname.isFile();
            }
        };

        if(myButton!=null)
            myButton.setText("OK");
        try {
            f=new File("/sdcard/");
            if(f==null) {
                myButton.setText("nullii");
                ;
            } else {
                File[] files = f.listFiles(filter);//listFiles();
                s="";
                if(files!=null) {
                    if (files.length > 0) {
                        for (File path : files) {
                            //for (String path : files) {
                            i++;
                            s = s+i+"." +path+"\n"; //+path.getName()+"\n";// "polku"; //path.getPath();
                        }
                    } else s=""+files.length+"\nJOTAIN\n";
                } else s="files==null"+f.getPath();
                //s=Environment.getExternalStorageDirectory().toString();
                myButton.setText("Ok!");
                myTextView.setText(s);
                s=s+Environment.getDataDirectory()+"\n";
                s=s+Environment.getExternalStoragePublicDirectory("mkv").getPath()+"\n";
                s=s+Environment.getExternalStorageState(f)+"\n";
                //s=s+Environment.getExternalStorageState(files[0])+"\n";
                s=s+Environment.getRootDirectory()+"\n";
                s=s+Environment.getRootDirectory()+"\n";

                myTextView.setText(""+s);
            }
        } catch (Exception e) {
            if(myButton!=null) myButton.setText(s+"\n"+e.toString());
        }
    }
}

Liitteenä kuvat tiedostoselaimesta, ja omasta ohjelmastani, kun on klikannut painiketta.
« Viimeksi muokattu: 29.07.17 - klo:15.34 kirjoittanut kamara »

nm

  • Käyttäjä
  • Viestejä: 16430
    • Profiili
Vs: Kuinka ulos Android studion emulaattorin hiekkalaatikosta ?
« Vastaus #1 : 28.07.17 - klo:16.17 »
Saat oikean sijainnin metodilla Environment.getExternalStorageDirectory(). Se on todennäköisesti listauksessakin näkyvä /storage/emulated/0

kamara

  • Käyttäjä
  • Viestejä: 3032
    • Profiili
Vs: Kuinka ulos Android studion emulaattorin hiekkalaatikosta ?
« Vastaus #2 : 28.07.17 - klo:17.24 »
Saat oikean sijainnin metodilla Environment.getExternalStorageDirectory(). Se on todennäköisesti listauksessakin näkyvä /storage/emulated/0

Joo saan sijainnin, mutta se ei ratkaise varsinaista ongelmaa.  :'(

Haluaisin lukea tiedostot (Matroskat/WebM), jotka löytyvät muistikortilta.

Kuten jo aiemmin sanoin, niin file-browser näkee eri tiedostot, kuin mun oma ohjelma.

Haluaisin pystyä lukemaan tuolla kortilla olevat matroskat ja WebM:t.

Tai vähintään File-kahvat, jotta pystyn lukemaan videon sisällön.

Siis kuvissa näkyy sama kännykkä päällä, ja niissä näkyvät eri tiedostot.

En ymmärrä, miksi näin on. ???

Olen myös laittanut emulaattorissa päälle tiedostojen manipuloinnin kyseiselle omalle ohjelmalleni.

Siis olen emulaattorissa omassa ohjelmassani eri kuplassa kuin Filemanager, ja haluaisin olla samassa kuplassa.

Vai onko kyseinen vain bugi-emulaattorissa ?


nm

  • Käyttäjä
  • Viestejä: 16430
    • Profiili
Vs: Kuinka ulos Android studion emulaattorin hiekkalaatikosta ?
« Vastaus #3 : 28.07.17 - klo:17.45 »
Saat oikean sijainnin metodilla Environment.getExternalStorageDirectory(). Se on todennäköisesti listauksessakin näkyvä /storage/emulated/0

Joo saan sijainnin, mutta se ei ratkaise varsinaista ongelmaa.  :'(

Haluaisin lukea tiedostot (Matroskat/WebM), jotka löytyvät muistikortilta.

Kuten jo aiemmin sanoin, niin file-browser näkee eri tiedostot, kuin mun oma ohjelma.

Testikoodissa listaat hakemiston /sdcard sisällön:

Koodia: [Valitse]
[...]
f=new File("/sdcard/");
[...]

Se on väärä sijainti. Androidin tiedostoselain näyttää historiallisista syistä tuon ulkoisen hakemiston sdcard-nimellä, mutta se ei ole tiedostojärjestelmässä oikea paikka. Käytä tuota getExternalStorageDirectoryn palauttamaa hakemistoa:

Koodia: [Valitse]
f=new File(Environment.getExternalStorageDirectory());
[...]

Millaisen listauksen saat silloin?


kamara

  • Käyttäjä
  • Viestejä: 3032
    • Profiili
Vs: Kuinka ulos Android studion emulaattorin hiekkalaatikosta ?
« Vastaus #4 : 28.07.17 - klo:18.11 »
Se on väärä sijainti. Androidin tiedostoselain näyttää historiallisista syistä tuon ulkoisen hakemiston sdcard-nimellä, mutta se ei ole tiedostojärjestelmässä oikea paikka. Käytä tuota getExternalStorageDirectoryn palauttamaa hakemistoa:

Koodia: [Valitse]
f=new File(Environment.getExternalStorageDirectory());
[...]

Millaisen listauksen saat silloin?

Valitettavasti f=new File(Environment.getExternalStorageDirectory());
ei käänny, mutta:
Koodia: [Valitse]
f=new File(""+Environment.getExternalStorageDirectory());
Kääntyy ja antaa...
Koodia: [Valitse]
1./storage/emulated/0/Music
2./storage/emulated/0/Podcasts
3./storage/emulated/0/Ringtones
4./storage/emulated/0/Alarms
5./storage/emulated/0/Notifications
6./storage/emulated/0/Pictures
7./storage/emulated/0/Movies
8./storage/emulated/0/Download
9./storage/emulated/0/DCIM
10./storage/emulated/0/Android
/data
./storage/emulated/0/mkv
mounted
/system
/system

Eli ollaan eri hiekkalaatikossa kuin Android:n oma teidostoselain... :P

Edit - Siis pitäisi olla SD-kortissa:
Koodia: [Valitse]
Android
LOST.DIR
koe2rivia.srt.mkv
Siis nämä näkyvät SD-kortin sisältönä.  :'(

Edit 2 - Siis koeohjelmani antaa saman sisällön, vaikka SD-kortti olisi unmountattu. Jos laittaa /sdcard/:n hakemistoksi, niin silloin ohjelma huomaa, onko kortti mountattu.  :-\
Tarkennus: Ei huomaakaan.
« Viimeksi muokattu: 28.07.17 - klo:18.21 kirjoittanut kamara »

nm

  • Käyttäjä
  • Viestejä: 16430
    • Profiili
Vs: Kuinka ulos Android studion emulaattorin hiekkalaatikosta ?
« Vastaus #5 : 29.07.17 - klo:00.44 »
Jahas, taitaakin olla niitä juttuja, joita ei ole kunnolla standardoitu Androidin SDK:ssa. Eri laitteissa on vähän erilaiset sijainnit ja käytännöt, ja voi olla vaikea kehittää yleisesti toimivaa ratkaisua. Environment.getExternalStorageDirectory() osoittaa usein vain laitteen sisäiseen tallennuskansioon, jolloin ulkoista korttia on etsittävä /storage-hakemiston alihakemistoista tai mount-komennon listausta tulkitsemalla.

Tässä muutama linkkivinkki, joiden kautta voi päästä eteenpäin ihmettelyssä:

https://stackoverflow.com/questions/11716448/how-to-access-external-micro-sd-card-of-the-phone
https://stackoverflow.com/questions/5694933/find-an-external-sd-card-location
http://pietromaggi.com/2014/10/19/finding-the-sdcard-path-on-android-devices/


AimoE

  • Käyttäjä
  • Viestejä: 2782
    • Profiili
Vs: Kuinka ulos Android studion emulaattorin hiekkalaatikosta ?
« Vastaus #6 : 29.07.17 - klo:09.51 »
Voisi myös katsoa ympäristömuuttujat. Omassa Samsung Galaxy -puhelimessani on muiden muuttujien lomassa:

Koodia: [Valitse]
ANDROID_STORAGE=/storage
EXTERNAL_STORAGE=/sdcard
ENC_EMULATED_STORAGE_TARGET=/storage/enc_emulated

Edit: en ole rootannut puhelinta, mutta saan nämä samat muuttujat kahden sovelluksen (SSHelper, Terminal Emulator) komentorivillä täsmälleen samanlaisina, vaikka muissa muuttujissa on joitakin eroja.
« Viimeksi muokattu: 29.07.17 - klo:10.07 kirjoittanut AimoE »

nm

  • Käyttäjä
  • Viestejä: 16430
    • Profiili
Vs: Kuinka ulos Android studion emulaattorin hiekkalaatikosta ?
« Vastaus #7 : 29.07.17 - klo:10.35 »
Voisi myös katsoa ympäristömuuttujat. Omassa Samsung Galaxy -puhelimessani on muiden muuttujien lomassa:

Koodia: [Valitse]
ANDROID_STORAGE=/storage
EXTERNAL_STORAGE=/sdcard
ENC_EMULATED_STORAGE_TARGET=/storage/enc_emulated

Edit: en ole rootannut puhelinta, mutta saan nämä samat muuttujat kahden sovelluksen (SSHelper, Terminal Emulator) komentorivillä täsmälleen samanlaisina, vaikka muissa muuttujissa on joitakin eroja.

Mutta onko mikään noista ulkoinen sd-kortti, jos tarkistat polun sisällön komentorivin kautta? Ainakin ANDROID_STORAGE on ylemmän tason sijainti, jonka alla on eri liitospisteitä. Niistä on kyllä mahdollisesti löydettävissä oikea hakemisto. EXTERNAL_STORAGE puolestaan on sama laite kuin Environment.getExternalStorageDirectory() -metodin palauttama sijainti, joka osoittaa useimmiten sisäiseen datahakemistoon. ENC_EMULATED_STORAGE_TARGET taas taitaa olla Samsung-spesifi muuttuja.

Onko muuttujia SECONDARY_STORAGE tai EXTERNAL_SDCARD_STORAGE määritelty? Ne olisivat muuten helpoin vaihtoehto oikean sijainnin selvittämiseen, mutta ilmeisesti joidenkin valmistajien omissa rommeissa ei ole määritelty kumpaakaan.
« Viimeksi muokattu: 29.07.17 - klo:10.36 kirjoittanut nm »

AimoE

  • Käyttäjä
  • Viestejä: 2782
    • Profiili
Vs: Kuinka ulos Android studion emulaattorin hiekkalaatikosta ?
« Vastaus #8 : 29.07.17 - klo:10.47 »
Mutta onko mikään noista ulkoinen sd-kortti, jos tarkistat polun sisällön komentorivin kautta?

Noilla tiedoilla sain sekä SD-kortinettä puhelimen sisäisen muistin mountattua Ubuntu-koneelle SSHeper-sovelluksen antaman yhteyden kautta. Enhän minä olisi noita kaivanut esille jos en olisi niitä tarvinnnut. Kun noi muuttujat oli valmiina, en joutunut etsimään ratkaisuja netistä, joten en olltu tajunnutkaan miten hankala juttu on kyseessä.

nm

  • Käyttäjä
  • Viestejä: 16430
    • Profiili
Vs: Kuinka ulos Android studion emulaattorin hiekkalaatikosta ?
« Vastaus #9 : 29.07.17 - klo:10.51 »
Noilla tiedoilla sain sekä SD-kortinettä puhelimen sisäisen muistin mountattua Ubuntu-koneelle SSHeper-sovelluksen antaman yhteyden kautta. Enhän minä olisi noita kaivanut esille jos en olisi niitä tarvinnnut. Kun noi muuttujat oli valmiina, en joutunut etsimään ratkaisuja netistä, joten en olltu tajunnutkaan miten hankala juttu on kyseessä.

Mikä noista muuttujista osoitti SD-korttiin Samsungin tapauksessa?

AimoE

  • Käyttäjä
  • Viestejä: 2782
    • Profiili
Vs: Kuinka ulos Android studion emulaattorin hiekkalaatikosta ?
« Vastaus #10 : 29.07.17 - klo:11.02 »
Korjaus:

olon skriptannut mountit sun muut niin kauan sitten etten muistanut enää yksityiskohtia. Pääasia on se että noiden muuttujien avulla pääsin jyvälle, mutta kun tarkemmin katson koodia, niin puhelimen sisäisen muistin polku on sdcard joka on sama kuin /storage/emulated/0, ja puhelimen SD-kortin mount point on /storage/9C33-6BBD, eli tuosta juuresta eteenpäin tavara on SD-kortilla. Tuo '9C33-6BBD' lienee mallikohtainen, tai ainakin valmistajakohtainen. Löysin polut tutkimalla hakemistojen sisältöjä, muistaakseni SSHelperin antaman näkymän kautta, mutta en ol eihan varma mitä kaikkia keinoja käytin. Vaati melkoista aivojumppaa tajuta että 'sdcard' on sisäinen muisti eikä SD-kortti.

Tomin

  • Palvelimen ylläpitäjä
  • Käyttäjä / moderaattori+
  • Viestejä: 11481
    • Profiili
    • Tomin kotisivut
Vs: Kuinka ulos Android studion emulaattorin hiekkalaatikosta ?
« Vastaus #11 : 29.07.17 - klo:12.32 »
Tuo '9C33-6BBD' lienee mallikohtainen, tai ainakin valmistajakohtainen.

Näyttää FAT- tai NTFS-osion tunnisteelta. Ne ovat enemmän tai vähemmän uniikkeja ja vaihtuvat kun luodaan uusi osio tai tiedostojärjestelmä.
Automaattinen allekirjoitus:
Lisäisitkö [RATKAISTU] ketjun ensimmäisen viestin aiheeseen ongelman ratkettua, kiitos.

AimoE

  • Käyttäjä
  • Viestejä: 2782
    • Profiili
Vs: Kuinka ulos Android studion emulaattorin hiekkalaatikosta ?
« Vastaus #12 : 29.07.17 - klo:12.39 »
Näyttää FAT- tai NTFS-osion tunnisteelta. Ne ovat enemmän tai vähemmän uniikkeja ja vaihtuvat kun luodaan uusi osio tai tiedostojärjestelmä.

Googleta /storage/9C33-6BBD ja kerro sitten uudestaan miltä näyttää.

Tomin

  • Palvelimen ylläpitäjä
  • Käyttäjä / moderaattori+
  • Viestejä: 11481
    • Profiili
    • Tomin kotisivut
Vs: Kuinka ulos Android studion emulaattorin hiekkalaatikosta ?
« Vastaus #13 : 29.07.17 - klo:14.54 »
Näyttää FAT- tai NTFS-osion tunnisteelta. Ne ovat enemmän tai vähemmän uniikkeja ja vaihtuvat kun luodaan uusi osio tai tiedostojärjestelmä.

Googleta /storage/9C33-6BBD ja kerro sitten uudestaan miltä näyttää.

Ei tarvitse olla töykeä. Näyttää se silti tuollaiselta, vaikka muidenkin puhelimissa tai emulaattoreissa käytettäisiinkin tuota tunnistetta. Kysymys lienee, miten se on generoitu (luultavasti ei ole, vaan joku ohjelma käyttää sitä osion sarjanumerona tässä tilanteessa). FAT- ja NTFS-osioiden sarjanumerot ovat paljon löysemmin määrättyjä kuin Linuxin tiedostojärjestelmien UUID:t.
Automaattinen allekirjoitus:
Lisäisitkö [RATKAISTU] ketjun ensimmäisen viestin aiheeseen ongelman ratkettua, kiitos.

AimoE

  • Käyttäjä
  • Viestejä: 2782
    • Profiili
Vs: Kuinka ulos Android studion emulaattorin hiekkalaatikosta ?
« Vastaus #14 : 29.07.17 - klo:14.58 »
Ei tarvitse olla töykeä.
Töykeä? Ei tarvitse ylitulkita.

kamara

  • Käyttäjä
  • Viestejä: 3032
    • Profiili
No, merkkasin tämän ratkaistuksi, vaikka näyttää siltä, ettei Androidissa ole kovin varteenotettavaa standardia tiedostojärjestelmää.

Lisäksi vaikuttaa siltä, että Android studion emulaattori kärsii pienistä bugeista, tai mahdollisesti omassa tietokoneessani on muutama bitti poikittain.

Tossa FAT:n tunnisteessa komppaan kyllä Tominia. Ne vaihtelivat eri emulaattoreissa. Lisäksi ne ovat MS:n tunnisteiden näköisiä. Toki joku Samsung voi kirjoittaa SD:n tunnisteeksi kaikille saman, jolloin googlaamalla löytää kyseisen tunnisteen.