Italian questi samsung non funzionano con la mia app

fifiddu70

Well-Known Member
Licensed User
Longtime User
Qualcuno mi sa dire come salvare una immagine jpg negli smartphone samsung? con il metodo file.dirrootexternal da errore e crasha l'app, metre sul 80% degli altri dispositivi funziona, mi sapete dire una soluzione che funzioni su tutti e anche sui dispositivi samsung? ho necessità di salvare sulla rootexternal perchè nella dir internal non salva il jpg e nemmeno sulle altre di cui dirdefault external.
 

LucaMs

Expert
Licensed User
Longtime User
Innanzitutto complimenti per il titolo; indica che sei una persona molto sicura di sé. Io avrei scritto: "La mia app non funziona con i Samsung", tu il contrario, sono i cattivoni Samsung a non far funzionare la tua app :)

Dovresti riportare il messaggio d'errore mostrato quando l'app va in crash (in modalità debug, meglio). Probabilmente sarà una questione di permessi e quindi non dovrebbe dipendere dalla marca del dispositivo ma dalla loro versione di Android.

Però non andrei a modificare questo (visto che "studiare" i permessi è complicato e qundi anche spiegarlo) ma...
perchè nella dir internal non salva il jpg
e questo non può essere; l'unica cosa è che potrebbe non essere sufficiente la memoria a disposizione, ma senza conoscere i messaggi d'errore...!

Magari pubblica anche la parte di codice che effettua il salvataggio.

[Tra l'altro, la DirRootExternal è a disposizione di tutte le app e dell'utente stesso, quindi i tuoi file non sarebbero al sicuro]
 
Last edited:

fifiddu70

Well-Known Member
Licensed User
Longtime User
La mia app è stata aggiornata con i permessi di root, io vi parlo di un problema che già nasceva con dal samsung s3 in poi, in pratica se scelgo di salvare il file sulla dirrootexternal l'app si chiude, mentre con altri dispositivi non samsung non succede, sembra che samsung utilizza un'altro percorso diverso dagli altri dispositivi.
 

Star-Dust

Expert
Licensed User
Longtime User
A me DirRootExternal funziona correttamente su tutti Samsung che ho. (S3,S6,Tab2,Tab3)

Verofica se il problema è un altro
 
Last edited:

LucaMs

Expert
Licensed User
Longtime User
La mia app è stata aggiornata con i permessi di root, io vi parlo di un problema che già nasceva con dal samsung s3 in poi, in pratica se scelgo di salvare il file sulla dirrootexternal l'app si chiude, mentre con altri dispositivi non samsung non succede, sembra che samsung utilizza un'altro percorso diverso dagli altri dispositivi.
1) se non è indispensabile che salvi sulla root, salva sulla internal che è molto meglio;
2) avvia l'app in modalità debug, mettendo un breakpoint prima del salvataggio e verifica i valori dele variabili (path);
3) posta il messaggio d'errore e magari il codice che esegue il salvataggio, altrimenti è inutile che chiedi aiuto, non potremmo dartelo.
 

sirjo66

Well-Known Member
Licensed User
Longtime User
anche io ho un sacco di Samsung (OS 4, 5, 6 e 7) e non ho mai avuto problemi
 

fifiddu70

Well-Known Member
Licensed User
Longtime User
Purtroppo non ho qui con me un'altro samsung per fare la prova, ricordo una volta si parla che il percorso di salvatggio dei samsung è diverso, non c'è un modo per far si che in maniera automatica salvi su un percorso che sia creato con rootexternal? il file jpg lo salva solo impostando dirrootexternal nei telefoni funzionanti mentre nel samsung dava questo errore, alla fine è una mia app che crea un falso bilgietto aereo condividibile su facebook, per fare uno scherzo.
 

sirjo66

Well-Known Member
Licensed User
Longtime User
uso di tutto: DirInternal, DirRootExternal e anche File.DirDefaultExternal

da un po' di tempo però, al posto di File.DirDefaultExternal uso GetSafeDirDefaultExternal

comunque non hai risposto alla domanda che ti hanno fatto: hai fatto la gestione della richiesta dei permessi ?? Se non lo hai fatto è ovvio che non riesci a scrivere su DirRootExternal su sistemi operativi da 6.0 in poi
 
Last edited:

Star-Dust

Expert
Licensed User
Longtime User
A questo punto visto che devi condividere il file, non chiedere solo dei permessi.
Per le versione di SDK23- basta che usi DirRootExternal,
Ma devi usare il metodo di Share sicuro (SDK 24+) per la condivisione dei file con altre App.

Ovviamente puoi escludere sicuramente DirInternal e DirDefaultExternal, la condivisione non funzionerebbe su nessuna versione di Android.
 
Last edited:

fifiddu70

Well-Known Member
Licensed User
Longtime User
i permessi li chiedo:
B4X:
rp.CheckAndRequest ( rp.PERMISSION_WRITE_EXTERNAL_STORAGE)
        Wait For Activity_PermissionResult ( Permission As String, Result As Boolean)
        If Result Then
            
            Dim out As OutputStream
            'Dim testfolder As String
            'testfolder = rp.GetSafeDirDefaultExternal("ticket")
            rp.GetSafeDirDefaultExternal(File.DirDefaultExternal)
            out = File.OpenOutput(File.DirDefaultExternal, "ticket.jpg", False)
            c.Bitmap.WriteToStream(out, 100, "JPEG")
            out.Close
            b = ResizeBitmap(LoadBitmap(File.DirDefaultExternal, "ticket.jpg"), 800, 500)
            
            Else
                
        
        End If
        
        
    
        txtdate.Text=""
        txtnumberfly.Text=""
        txtclockgates.Text=""
        txtseatnumber.Text=""
        txtfrom.Text=""
        txtto.Text=""
        txtclok.Text=""
        txtpassenger.Text=""
    

        
        share.sharebinary ("file://" & File.DirDefaultExternal &  "/" & "ticket.jpg", "image/jpg", "CONDIVIDI Boarding Pass con:", "Ti Piace Boarding Pass? Condividila con i tuoi amici")
con questo codice riesco a salvare su tutti i dispositivi tranne samsung, sembra che non esiste il percorso dove salvare il file jpg
 

Star-Dust

Expert
Licensed User
Longtime User
Perdonami @fifiddu70, non ti offendere, mi sa che non hai capito un bel niente della condivisione dei file con SDK 24+

Questo pezzo non vuol dire niente e non fa niente
B4X:
 Dim out As OutputStream
 'Dim testfolder As String
 'testfolder = rp.GetSafeDirDefaultExternal("ticket")
 rp.GetSafeDirDefaultExternal(File.DirDefaultExternal)

Dopo che hai chiesto i permessi per leggere e scrivere nella RootExternal non vuol dire che puoi usare il link diretto per condividere il file.
Per condividere il file, devi creare, una cartella SHARED all'interno della tua App e renderla zona Salva (GetSafeDirDefaultExternal). Poi devi copiare il file creato nella zona Salva e renderla condivisibile con CreateFileProviderUri (che ho allegato)

Ottieni un link che puoi condividere..... Il codice andrebbe scritto così
B4X:
Sub Save
    Dim P As Phone
    rp.CheckAndRequest ( rp.PERMISSION_WRITE_EXTERNAL_STORAGE)
    Wait For Activity_PermissionResult ( Permission As String, Result As Boolean)
    If Result Then
        Dim out As OutputStream
        out = File.OpenOutput(File.DirDefaultExternal, "ticket.jpg", False)
        c.Bitmap.WriteToStream(out, 100, "JPEG")
        out.Close
        b = ResizeBitmap(LoadBitmap(File.DirDefaultExternal, "ticket.jpg"), 800, 500)
  
        If P.SdkVersion>=24 Then
            Dim shared As String
            shared = rp.GetSafeDirDefaultExternal("ticket")
            File.Copy(File.DirDefaultExternal, "ticket.jpg",shared, "ticket.jpg")
            Sleep(500)
            share.sharebinary (CreateFileProviderUri(shared, "ticket.jpg"), "image/jpg", "CONDIVIDI Boarding Pass con:", "Ti Piace Boarding Pass? Condividila con i tuoi amici")
'            IO CONDIVEDEREI COSI
'            Dim in As Intent
'            in.Initialize(in.ACTION_VIEW, CreateFileProviderUri(shared,"ticket.jpg"))
'            in.SetType("image/jpeg")
'            in.Flags = 1
'            StartActivity(in)
        Else
            share.sharebinary ("file://" & File.DirDefaultExternal &  "/" & "ticket.jpg", "image/jpg", "CONDIVIDI Boarding Pass con:", "Ti Piace Boarding Pass? Condividila con i tuoi amici")
        End If
    Else
        ToastMessageShow("Sorry permission denied",False)
    End If
 
End Sub

Sub CreateFileProviderUri (Dir As String, FileName As String) As Object
    Dim FileProvider As JavaObject
    Dim context As JavaObject
    context.InitializeContext
 
    'File.Copy(Dir, FileName, shared, FileName)
    FileProvider.InitializeStatic("android.support.v4.content.FileProvider")
    Dim f As JavaObject
    f.InitializeNewInstance("java.io.File", Array(shared, FileName))
    Return FileProvider.RunMethod("getUriForFile", Array(context, Application.PackageName & ".provider", f))
End Sub

Ti ho riscritto il codice, spero che tu capisca di aver ricevuto un grosso aiuto.

Nel futuro prima di spingerti su nuovi orizzonti informatici a te sconosciuti, assicurati di aver studiato a dovere i tutorial.
Non puoi sperare fare cose serie e limitarti a fare lo sviluppatore hobbista, che copia e incolla pezzi di codice presi dal forum sperando che poi funzionino.

P.S. La Samsung ha tante colpe, ma questa volta la colpa è tua :p
 
Last edited:

sirjo66

Well-Known Member
Licensed User
Longtime User
confermo che il codice di fifiddu70 è sbagliato e quindi è normale non riuscire a scrivere il file, domani se ho un attimo di tempo vedo di correggerlo comunque ottimo il codice di star-dust
 
Last edited:

Star-Dust

Expert
Licensed User
Longtime User
Perdonami @fifiddu70, non ti offendere, mi sa che non hai capito un bel niente della condivisione dei file con SDK 24+

Questo pezzo non vuol dire niente e non fa niente
B4X:
 Dim out As OutputStream
 'Dim testfolder As String
 'testfolder = rp.GetSafeDirDefaultExternal("ticket")
 rp.GetSafeDirDefaultExternal(File.DirDefaultExternal)

Dopo che hai chiesto i permessi per leggere e scrivere nella RootExternal non vuol dire che puoi usare il link diretto per condividere il file.
Per condividere il file, devi creare, una cartella SHARED all'interno della tua App e renderla zona Salva (GetSafeDirDefaultExternal). Poi devi copiare il file creato nella zona Salva e renderla condivisibile con CreateFileProviderUri (che ho allegato)

Ottieni un link che puoi condividere..... Il codice andrebbe scritto così
B4X:
Sub Save
    Dim P As Phone
    rp.CheckAndRequest ( rp.PERMISSION_WRITE_EXTERNAL_STORAGE)
    Wait For Activity_PermissionResult ( Permission As String, Result As Boolean)
    If Result Then
        Dim out As OutputStream
        out = File.OpenOutput(File.DirDefaultExternal, "ticket.jpg", False)
        c.Bitmap.WriteToStream(out, 100, "JPEG")
        out.Close
        b = ResizeBitmap(LoadBitmap(File.DirDefaultExternal, "ticket.jpg"), 800, 500)
 
        If P.SdkVersion>=24 Then
            Dim shared As String
            shared = rp.GetSafeDirDefaultExternal("ticket")
            File.Copy(File.DirDefaultExternal, "ticket.jpg",shared, "ticket.jpg")
            Sleep(500)
            share.sharebinary (CreateFileProviderUri(shared, "ticket.jpg"), "image/jpg", "CONDIVIDI Boarding Pass con:", "Ti Piace Boarding Pass? Condividila con i tuoi amici")
'            IO CONDIVEDEREI COSI
'            Dim in As Intent
'            in.Initialize(in.ACTION_VIEW, CreateFileProviderUri(shared,"ticket.jpg"))
'            in.SetType("image/jpeg")
'            in.Flags = 1
'            StartActivity(in)
        Else
            share.sharebinary ("file://" & File.DirDefaultExternal &  "/" & "ticket.jpg", "image/jpg", "CONDIVIDI Boarding Pass con:", "Ti Piace Boarding Pass? Condividila con i tuoi amici")
        End If
    Else
        ToastMessageShow("Sorry permission denied",False)
    End If
 
End Sub

Sub CreateFileProviderUri (Dir As String, FileName As String) As Object
    Dim FileProvider As JavaObject
    Dim context As JavaObject
    context.InitializeContext
 
    'File.Copy(Dir, FileName, shared, FileName)
    FileProvider.InitializeStatic("android.support.v4.content.FileProvider")
    Dim f As JavaObject
    f.InitializeNewInstance("java.io.File", Array(shared, FileName))
    Return FileProvider.RunMethod("getUriForFile", Array(context, Application.PackageName & ".provider", f))
End Sub

Ti ho riscritto il codice, spero che tu capisca di aver ricevuto un grosso aiuto.

Nel futuro prima di spingerti su nuovi orizzonti informatici a te sconosciuti, assicurati di aver studiato a dovere i tutorial.
Non puoi sperare fare cose serie e limitarti a fare lo sviluppatore hobbista, che copia e incolla pezzi di codice presi dal forum sperando che poi funzionino.

P.S. La Samsung ha tante colpe, ma questa volta la colpa è tua :p
ho solo cercato di correggere gli errori mantenendo il più possibile il codice originale di @fifiddu70
 

LucaMs

Expert
Licensed User
Longtime User
mi sa che non hai capito un bel niente
Però non andrei a modificare questo (visto che "studiare" i permessi è complicato e qundi anche spiegarlo)
Ripeto che, a meno che non sia necessario per motivi "particolari", è sempre meglio usare la DirInternal, sia perché non si ha la necessità di permessi, sia perché i file sono "più al sicuro".

Poi fate come ve pare :D
 

sirjo66

Well-Known Member
Licensed User
Longtime User
La GetSafeDirDefaultExternal serve per avere accesso alla DirDefaultExternal senza dover chiedere nessun tipo di permesso, dato che è la cartella della stessa applicazione, praticamente come se tu accedessi alla DirInternal

E quindi, al posto della DirDefaultExternal basta che usi la GetSafeDirDefaultExternal
ad esempio:
B4X:
out = File.OpenOutput(rp.GetSafeDirDefaultExternal(""), "ticket.jpg", False)
c.Bitmap.WriteToStream(out, 100, "JPEG")
out.Close
b = ResizeBitmap(LoadBitmap(rp.GetSafeDirDefaultExternal(""), "ticket.jpg"), 800, 500)

come vedi al posto di DirDefaultExternal ho semplicemente usato rp.GetSafeDirDefaultExternal("")
se vuoi ottimizzare il codice puoi calcolarti una volta sola la GetSafeDirDefaultExternal e poi usarla nella tua app, io infatti faccio così:
B4X:
Dim CartellaExternal = rp.GetSafeDirDefaultExternal("") ' questo lo faccio all'inizio dell'app, una volta sola
....
....
out = File.OpenOutput(CartellaExternal, "ticket.jpg", False)
c.Bitmap.WriteToStream(out, 100, "JPEG")
out.Close
b = ResizeBitmap(LoadBitmap(CartellaExternal, "ticket.jpg"), 800, 500)

Sergio
 

fifiddu70

Well-Known Member
Licensed User
Longtime User
La GetSafeDirDefaultExternal serve per avere accesso alla DirDefaultExternal senza dover chiedere nessun tipo di permesso, dato che è la cartella della stessa applicazione, praticamente come se tu accedessi alla DirInternal

E quindi, al posto della DirDefaultExternal basta che usi la GetSafeDirDefaultExternal
ad esempio:
B4X:
out = File.OpenOutput(rp.GetSafeDirDefaultExternal(""), "ticket.jpg", False)
c.Bitmap.WriteToStream(out, 100, "JPEG")
out.Close
b = ResizeBitmap(LoadBitmap(rp.GetSafeDirDefaultExternal(""), "ticket.jpg"), 800, 500)

come vedi al posto di DirDefaultExternal ho semplicemente usato rp.GetSafeDirDefaultExternal("")
se vuoi ottimizzare il codice puoi calcolarti una volta sola la GetSafeDirDefaultExternal e poi usarla nella tua app, io infatti faccio così:
B4X:
Dim CartellaExternal = rp.GetSafeDirDefaultExternal("") ' questo lo faccio all'inizio dell'app, una volta sola
....
....
out = File.OpenOutput(CartellaExternal, "ticket.jpg", False)
c.Bitmap.WriteToStream(out, 100, "JPEG")
out.Close
b = ResizeBitmap(LoadBitmap(CartellaExternal, "ticket.jpg"), 800, 500)

Sergio
Grazie Sergio.
appena ho due minuti lo devo provare, in questi due giorni sono impegnato ad un evento che mi cambia la vita, sto per trasferirmi per lavoro con tutta la famiglia da partanna - TP a San Giovanni la Punta - CT quindi spero per sabato essere nella nuova abitazione, nel frattempo sto preparando le cose da portare via.
Ti faccio sapere come faccio tutto.
 

Star-Dust

Expert
Licensed User
Longtime User
La GetSafeDirDefaultExternal serve per avere accesso alla DirDefaultExternal senza dover chiedere nessun tipo di permesso, dato che è la cartella della stessa applicazione, praticamente come se tu accedessi alla DirInternal

E quindi, al posto della DirDefaultExternal basta che usi la GetSafeDirDefaultExternal
ad esempio:
B4X:
out = File.OpenOutput(rp.GetSafeDirDefaultExternal(""), "ticket.jpg", False)
c.Bitmap.WriteToStream(out, 100, "JPEG")
out.Close
b = ResizeBitmap(LoadBitmap(rp.GetSafeDirDefaultExternal(""), "ticket.jpg"), 800, 500)

come vedi al posto di DirDefaultExternal ho semplicemente usato rp.GetSafeDirDefaultExternal("")
se vuoi ottimizzare il codice puoi calcolarti una volta sola la GetSafeDirDefaultExternal e poi usarla nella tua app, io infatti faccio così:
B4X:
Dim CartellaExternal = rp.GetSafeDirDefaultExternal("") ' questo lo faccio all'inizio dell'app, una volta sola
....
....
out = File.OpenOutput(CartellaExternal, "ticket.jpg", False)
c.Bitmap.WriteToStream(out, 100, "JPEG")
out.Close
b = ResizeBitmap(LoadBitmap(CartellaExternal, "ticket.jpg"), 800, 500)

Sergio
Il tuo codice è corretto ma non funzionerebbe credo su SDK inferiore a 24.
Mentre salvando anche su DirRootExternal permetti i device più vecchi (non samsung :p) di poter condividere l'immagine
 
Top