2017-07-18 1 views
0

Je suis en train de créer une application EPG pour Android TV, j'ai donc besoin d'accéder aux données des chaînes stockées dans "/data/data/com.android.providers.tv/databases/tv.db" . J'ai essayé de faire une base de données helper c'est le code:sur les données EPG dans Android TV

package com.example.test;

import android.content.Context; 
import android.database.Cursor; 
import android.database.SQLException; 
import android.database.sqlite.SQLiteDatabase; 
import android.database.sqlite.SQLiteException; 
import android.database.sqlite.SQLiteOpenHelper; 
import android.util.Log; 

import java.io.FileOutputStream; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.OutputStream; 

/** 
* Created by Ahmed on 18/07/2017. 
*/ 

public class DatabaseHelper extends SQLiteOpenHelper { 

    String DB_PATH=null; 
    private static String DB_NAME="tvls -"; 
    private SQLiteDatabase myDataBase; 
    private final Context myContext; 


    public DatabaseHelper(Context context) { 
     super(context, DB_NAME, null , 10); 
     this.myContext=context; 
     this.DB_PATH="/data/data/com.android.providers.tv/databases"; 
     Log.e("Path 1",DB_PATH); 
    } 
    public void createDataBase() throws IOException{ 
     boolean dbExist = checkDataBase(); 
     Log.i("Database Existe ?",""+dbExist); 
     if (dbExist){ 

     }else{ 
      this.getReadableDatabase(); 
      try { 
       copyDataBase(); 
      } catch (Exception e) { 
       throw new Error("Error coying database"); 
      } 
     } 
    } 

    private void copyDataBase() throws IOException { 
     InputStream myInput = myContext.getAssets().open(DB_NAME); 
     String outFileName = DB_PATH + DB_NAME; 
     OutputStream myOutput = new FileOutputStream(outFileName); 
     byte[] buffer = new byte[10]; 
     int length; 
     while ((length=myInput.read(buffer))>0){ 
      myOutput.write(buffer,0,length); 

     } 
     myOutput.flush(); 
     myOutput.close(); 
     myInput.close(); 
    } 

    private boolean checkDataBase() { 
     SQLiteDatabase checkDB = null; 
     try{ 
      String myPath= DB_PATH + DB_NAME; 
      checkDB = SQLiteDatabase.openDatabase(myPath,null,SQLiteDatabase.OPEN_READONLY); 

     }catch (SQLiteException e){ 
      e.printStackTrace(); 
     } 
     if (checkDB !=null){ 
      checkDB.close(); 
     } 
     return checkDB != null ? true : false; 


    } 
public void openDataBase() throws SQLException{ 
    String myPath= DB_PATH + DB_NAME; 
    myDataBase = SQLiteDatabase.openDatabase(myPath,null,SQLiteDatabase.OPEN_READONLY); 

} 

    @Override 
    public synchronized void close() { 
     if(myDataBase!=null) 
      myDataBase.close(); 
     super.close(); 
    } 

    @Override 
    public void onCreate(SQLiteDatabase db) {} 

    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
     if (newVersion > oldVersion) 
      try { 
       copyDataBase(); 
      } catch (IOException e) { 
       e.printStackTrace(); 

      } 
    } 
    public Cursor query(String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy) { 
     return myDataBase.query("channels", null, null, null, null, null, null); 
    } 
} 

mais il dose pas se connecter au tv.db et me jette cette erreur:

07-18 23:16:01.970 5361-5361/com.example.test E/AndroidRuntime: FATAL EXCEPTION: main Process: com.example.test, PID: 5361 java.lang.Error: Error coying database at com.example.test.DatabaseHelper.createDataBase(DatabaseHelper.java:44) at com.example.test.MainActivity.onCreate(MainActivity.java:46) at android.app.Activity.performCreate(Activity.java:6237) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1107) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2369) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476) at android.app.ActivityThread.-wrap11(ActivityThread.java) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:148) at android.app.ActivityThread.main(ActivityThread.java:5417) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)

PS: S'il y a des informations sur la façon d'utiliser TvProvider s'il vous plaît aider, je suis coincé. Tout ce que je dois faire est de lire la liste des chaînes et la liste de leurs programmes.

+0

Le guide le plus proche que je puisse trouver en ce qui concerne les EPG se trouve dans [Viewing for TV Input Framework] (https://source.android.com/devices/tv/#viewing). Vous ne savez pas si cela vous aidera, mais il existe un guide [Building TV Channels] (https://developer.android.com/training/tv/tif/index.html) et un [exemple de code android-tv] (https: // github.com/googlesamples/androidtv-sample-inputs) vous pouvez exécuter. – noogui

Répondre

0

J'ai trouvé la réponse à cette question: vous devez passer passer un contentResolver pour obtenir des données et stocker la requête de résultat dans un curseur.

cursor = mContext.getContentResolver().query(TvContractCompat.Channels.CONTENT_URI, 
       Channel.PROJECTION, 
       null, 
       null, 
       null); 
if (cursor != null && cursor.moveToFirst()) { 
       Log.i(TAG,cursor.getCount()+"Chaines ont étaient mise à jour avec Succés"); 
       do { 
        channels.add(Channel.fromCursor(cursor)); 

       }while (cursor.moveToNext()); 

alors, afin d'obtenir accès aux données epg vous devez mettre ces lignes dans le manifeste:

<uses-permission android:name="com.android.providers.tv.permission.READ_EPG_DATA" /> 

    <uses-permission android:name="com.android.providers.tv.permission.WRITE_EPG_DATA" /> 

    <uses-permission android:name="com.android.providers.tv.permission.ACCESS_ALL_EPG_DATA"/> 

si vous installez l'application comme une application utilisateur de l'application ne recevra que le GEP les données qu'il crée afin d'obtenir toutes les données EPG dans le téléviseur, vous devez l'installer en tant qu'application système dans le dossier/system/priv-app.