2017-07-18 1 views
0

Androidチャンネル用のEPGアプリを作成していますので、 "/data/data/com.android.providers.tv/databases/tv.db"に保存されているチャンネルのデータにアクセスする必要があります。私はデータベースヘルパーを作成しようとしました。これはコードです:Android TVのEPGデータについて

パッケージ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); 
    } 
} 

が、それはtv.dbに接続して、私は、このエラーがスローされない用量:

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:TvProviderを使用する方法についての情報がある場合は、私がこだわっている助けてください。 私がする必要があるのは、チャンネルの一覧とその番組リストを読むことだけです。

+0

EPGに関する最もわかりやすいガイドは[TV入力フレームワークの表示](https://source.android.com/devices/tv/#viewing)にあります。これが役立つかどうかはわかりませんが、[テレビチャンネルの作成](https://developer.android.com/training/tv/tif/index.html)ガイドと[サンプルAndroidチャンネルコード](https:// github.com/googlesamples/androidtv-sample-inputs)を実行することができます。 – noogui

答えて

0

私はこの質問に関する答えを見つけました: あなたはデータを取得し、結果クエリをカーソルに格納するためにcontentResolverをスローする必要があります。

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()); 

そして、EPGデータへのアクセスもを得るために、あなたはマニフェストにこれらの行を配置する必要があります。

<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"/> 

ユーザーアプリとしてアプリをインストールした場合、アプリは唯一のEPGを取得しますあなたが/ system/priv-appフォルダにsystem appとしてインストールする必要があるtv内のすべてのepgデータを取得するために作成するデータ。

関連する問題