2013-03-26 16 views
7

Ho bisogno di creare un'app che riproduca video con un pulsante a schermo intero sul video. Il pulsante viene utilizzato per commutare manualmente tra orizzontale e verticale del display video. Non vogliamo il rilevamento della rotazione automatica. Quindi il file Manifest è impostato come sotto.Android: orientamento dello schermo manuale senza riavviare l'attività?

<activity 
    android:name=".VideoActivity" 
    android:screenOrientation="portrait" 
    android:configChanges="keyboardHidden"/> 

Ho usato

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE); o setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_PORTRAIT);

per impostare manualmente l'orientamento. Funziona ma riavvia l'attività: è stato chiamato onCreate(). Quindi la riproduzione del video ricomincia dall'inizio in modo imprevisto. Non riesco a renderlo liscio come se usassi - il metodo di rilevamento della rotazione automatica.

Quindi, come modificare manualmente l'orientamento dello schermo senza riavviare l'attività?

Grazie.

+0

Non è possibile. È come funziona il sistema. Deve rifare un sacco di lavoro e distrugge solo l'attività, per ricrearla. –

+0

Si prega di fare riferimento a questo: http://stackoverflow.com/questions/8032475/oncreate-is-called-twice-after-the-device-is-rotated –

risposta

5

Per cambiare l'orientamento manaul:

<activity 
    android:name=".VideoDetails" 
    android:configChanges="orientation"/> 

public class VideoDetails extends Activity { 
    ... 
    onStart() { 
     setRequestedOrientation(orientation); 
    } 
    onConfigurationChanged(Configuration newConfig){ 
     // do stuff for orientation change. 
    } 
    onClick() { 
     setRequestedOrientation(orientation); 
    } 
} 

Per l'orientamento automatico di rilevare:

<activity 
    android:name=".VideoDetails" 
    android:configChanges="orientation"/> 

public class VideoDetails extends Activity { 
    ... 
    onConfigurationChanged(Configuration newConfig){ 
     // do stuff for orientation change. 
    } 
} 
1

Inizia con l'aggiunta del nodo android:configChanges al Activity's manifesta nodo

android:configChanges="keyboardHidden|orientation" 

Per ulteriori informazioni consulta this collegamento

+0

Grazie. Il tuo metodo sembra rilevare automaticamente il cambiamento di orientamento da parte del sistema. Può impedire il riavvio dell'attività. Ma non voglio il rilevamento automatico. Ho bisogno di un manuale. – user1835097

+0

@ user1835097 quindi è possibile eseguire l'override di Activity.onConfigurationChanged – Janmejoy

+0

@ user1835097 controllare questo collegamento http://c0deattack.wordpress.com/2010/12/25/dealing-with-screen-orientation-changes-manually/ – Janmejoy

2

http://developer.android.com/guide/topics/resources/runtime-changes.html. Si può avere un guardare al link sotto la voce Gestione della configurazione cambiare se stessi

<activity android:name=".MyActivity" 
     android:configChanges="orientation|keyboardHidden" 
     android:label="@string/app_name"> 

Ora, quando una di queste configurazioni cambiano, MyActivity non si riavvia. Invece, MyActivity riceve una chiamata a onConfigurationChanged(). Questo metodo viene passato un oggetto Configuration che specifica la nuova configurazione del dispositivo.

android:configChanges="orientation|screenSize" (andorid 3.2 and above screen size also changes. add this) 

Supponi che il tuo video sia di 10 minuti. Il video viene riprodotto fino a 5 minuti e l'orientamento cambia, si sa che ha suonato fino a 5 minuti.

È possibile salvare l'avanzamento effettivo del video in onSaveInstanceState() e ottenere i dati salvati in onRestoreInstanceState() dal pacchetto, dopodiché è possibile iniziare la riproduzione con i dati di avanzamento o dall'inizio se ci fosse nessun dato salvato

Quando l'orientamento cambia attività viene distrutta e ricreata. Se si desidera salvare i dati e mantenere si può fare come di seguito per il salvataggio di grandi set di dati

@Override 
public Object onRetainNonConfigurationInstance() { 
final MyDataObject data = collectMyLoadedData(); 
return data; 
} 


@Override 
public void onCreate(Bundle savedInstanceState) { 
super.onCreate(savedInstanceState); 
setContentView(R.layout.main); 

final MyDataObject data = (MyDataObject) getLastNonConfigurationInstance(); 
if (data == null) { 
    data = loadMyData(); 
} 

} 

Per piccolo insieme di dati

@Override 
public void onSaveInstanceState(Bundle savedInstanceState) { 
super.onSaveInstanceState(savedInstanceState); 
// Save UI state changes to the savedInstanceState. 
// This bundle will be passed to onCreate if the process is 
// killed and restarted. 
savedInstanceState.putString("NICK_NAME", Name);//save nick name 
} 

@Override 
public void onRestoreInstanceState(Bundle savedInstanceState) { 
super.onRestoreInstanceState(savedInstanceState); 
// Restore UI state from the savedInstanceState. 
// This bundle has also been passed to onCreate. 
Name = savedInstanceState.getString("NICK_NAME");//restore nick name 
} 

Per controllare l'orientamento

@Override 
public void onConfigurationChanged(Configuration newConfig) { 
super.onConfigurationChanged(newConfig); 

// Checks the orientation of the screen 
if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) { 
    Toast.makeText(this, "landscape", Toast.LENGTH_SHORT).show(); 
} else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){ 
    Toast.makeText(this, "portrait", Toast.LENGTH_SHORT).show(); 
} 
} 

VideoView in Android. In questo caso anche il video viene trasmesso dal server. Controllare la risposta accettata (risposta di Commonsware). Esattamente lo stesso che ho suggerito.

+0

Grazie. Il tuo metodo per usare 'onSaveInstanceState()' e 'onRestoreInstanceState()' è una delle soluzioni. Ma la mia preoccupazione è la fluidità della riproduzione dei video, dal momento che la mia app riproduce video in streaming dal server. La ri-connessione e il tempo di ricerca del video renderebbero la riproduzione video discontinua. – user1835097

+0

@ user1835097 controlla l'ultimo collegamento. L'utente stava anche effettuando lo streaming di video dal server. controlla la risposta accettata. – Raghunandan

0

Aggiungere il tag

"android:configChanges="keyboard|keyboardHidden|orientation|screenSize|navigation" for your activity in Manifest.xml, 

e sovrascrivere il metodo

public void onConfigurationChanged(Configuration newConfig) {} 

Se avete bisogno di cambiare il layout su orientationChange chek questo replace layout on orientation change

0

Avere il riavvio app dopo il cambio di orientamento è inevitabile.

Mantenere la variabile relativa allo stato del video su Applicazione in modo che l'attività non ricomincia la riproduzione all'inizio.

Questo codice proviene da un'app campione che ho provato per testare questa risposta.

public class MyApplication extends Application { 
int counter; 
@Override 
public void onCreate() { 
    super.onCreate(); 
    counter = 0; 
    } 
} 

aggiungere l'applicazione sul vostro manifesto

<application 
    android:allowBackup="true" 
    android:icon="@drawable/ic_launcher" 
    android:label="@string/app_name" 
    android:theme="@style/AppTheme" 
    android:name="com.example.orientationchange.MyApplication" > 
    <activity 
... 

Uso withing attività:

public class MainActivity extends Activity { 

TextView output; 
MyApplication app ; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    app = (MyApplication) getApplication(); 
    setContentView(R.layout.activity_main); 
    output = (TextView) findViewById(R.id.output); 
    //A counter thread used to test the solution. 
    new CounterTask().execute(100); 
} 
... 

Ora la rotazione non pulisce le variabili di stato.

In alternativa, è possibile utilizzare Preferenze per una soluzione più pesante per la conservazione dello stato. Le preferenze ricorderanno anche lo stato da un utilizzo dell'app a un altro, in cui lo stato dell'applicazione viene ripulito suDestroy() dell'app.