2016-04-20 28 views
3

ローカルビデオURI /パス/ファイルをchromecastのMediaInfo.Builder()に設定するにはどうすればよいですか?また、誰もが画像とビデオをAndroid搭載ストレージからローカルに読み込んでGoogle Chromeのキャストにキャストする方法のコードスニペットを教えてくれますか? 他の質問も読んでくださいが、そこにはアプリでローカルサーバーを作成することが記載されています。実際にこれを行う必要がある場合、これを実装する方法は?私はhttps://github.com/googlecast/CastVideos-androidで利用可能なコードを使用していますが、そこにはビデオが取得され、URLから再生されます。私はローカルストレージからビデオをロードしたいと思っています。また、イメージを表示したいと思います。ビデオと画像をローカルストレージからGoogle ChromeCastに読み込む

更新: "NanoHttpD"を使用してローカルサーバーを作成しましたが、選択したローカルファイルのURLを取得できません。以下は私のAcitivitiesコードスニペットです:

public class VideoBrowserFragment extends Fragment implements VideoListAdapter.ItemClickListener, 
     LoaderManager.LoaderCallbacks<List<MediaInfo>> { 

    private static final String TAG = "zz VideoBrowserFragment"; 
    private static final int REQUEST_TAKE_GALLERY_VIDEO = 123; 
    private static final String CATALOG_URL = 
      "http://commondatastorage.googleapis.com/gtv-videos-bucket/CastVideos/f.json"; 
    private RecyclerView mRecyclerView; 
    private VideoListAdapter mAdapter; 
    private View mEmptyView; 
    private View mLoadingView; 
    private VideoCastManager mCastManager; 
    private VideoCastConsumerImpl mCastConsumer; 
    private View btnLocalVideo; 
    LocalServer server; 
    String chosenExt = ""; 
    String localFileName = ""; 
    String localFilePath = ""; 
    String formatedIpAddress = ""; 
    Uri selectedImageUri; 

    public VideoBrowserFragment() { 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, 
          @Nullable Bundle savedInstanceState) { 
     Toast.makeText(getActivity(), "VideoBrowserFragment onCreateView", Toast.LENGTH_SHORT).show(); 
     Log.d(TAG, "VideoBrowserFragment onCreateView"); 
     return inflater.inflate(R.layout.video_browser_fragment, container, false); 
    } 

    @Override 
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { 
     super.onViewCreated(view, savedInstanceState); 

     Toast.makeText(getActivity(), "VideoBrowserFragment onViewCreated", Toast.LENGTH_SHORT).show(); 
     Log.d(TAG, "VideoBrowserFragment onViewCreated"); 

     mRecyclerView = (RecyclerView) getView().findViewById(R.id.list); 
     mEmptyView = getView().findViewById(R.id.empty_view); 
     mLoadingView = getView().findViewById(R.id.progress_indicator); 
     btnLocalVideo = getView().findViewById(R.id.btnLocalVideo); 
     LinearLayoutManager layoutManager = new LinearLayoutManager(getActivity()); 
     layoutManager.setOrientation(LinearLayoutManager.VERTICAL); 
     mRecyclerView.setLayoutManager(layoutManager); 
     mAdapter = new VideoListAdapter(this); 
     mRecyclerView.setAdapter(mAdapter); 
     getLoaderManager().initLoader(0, null, this); 
     mCastManager = VideoCastManager.getInstance(); 
     mCastConsumer = new VideoCastConsumerImpl() { 
      @Override 
      public void onConnected() { 
       super.onConnected(); 
       mAdapter.notifyDataSetChanged(); 
      } 

      @Override 
      public void onDisconnected() { 
       super.onDisconnected(); 
       mAdapter.notifyDataSetChanged(); 
      } 
     }; 
     mCastManager.addVideoCastConsumer(mCastConsumer); 


//fetch local video 
     btnLocalVideo.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 

       Intent intent = new Intent(); 
       intent.setType("video/*"); 
       intent.setAction(Intent.ACTION_GET_CONTENT); 
       startActivityForResult(Intent.createChooser(intent, "Select Video"), REQUEST_TAKE_GALLERY_VIDEO); 


      } 
     }); 
    } 


    //get data of locally fetched videos.... 
    @Override 
    public void onActivityResult(int requestCode, int resultCode, Intent data) { 
     if (resultCode == getActivity().RESULT_OK) { 
      if (requestCode == REQUEST_TAKE_GALLERY_VIDEO) { 
       selectedImageUri = data.getData(); 

       Toast.makeText(getActivity(), "Sending local video data", Toast.LENGTH_SHORT).show(); 
       MediaMetadata movieMetadata = new MediaMetadata(MediaMetadata.MEDIA_TYPE_MOVIE); 

       movieMetadata.putString(MediaMetadata.KEY_SUBTITLE, "Local Subtitle"); 
       movieMetadata.putString(MediaMetadata.KEY_TITLE, "Local Video is playing"); 

       JSONObject jsonObj = null; 
       try { 
        jsonObj = new JSONObject(); 
        jsonObj.put("description", "Sample Descrioption over here"); 
       } catch (JSONException e) { 
        Log.e(TAG, "Failed to add description to the json object", e); 
       } 
       String filePath = getPath(selectedImageUri); 
       chosenExt = filePath.substring(filePath.lastIndexOf(".") + 1); 
       startLocalServer(); 
       String localUrl = formatedIpAddress + localFilePath; 
       Log.d(TAG, "MediaInfo urlLocal: " + localUrl); 
       MediaInfo item = new MediaInfo.Builder(localUrl) 
         .setStreamType(MediaInfo.STREAM_TYPE_BUFFERED) 
         .setContentType("video/mp4") 
         .setMetadata(movieMetadata) 
         .setStreamDuration(333 * 1000) 
         .build(); 
       Log.d(TAG, "VideoBrowserFragment itemClicked media :" + Utils.mediaInfoToBundle(item)); 

       Intent intent = new Intent(getActivity(), LocalPlayerActivity.class); 
       intent.putExtra("media", Utils.mediaInfoToBundle(item)); 
       intent.putExtra("shouldStart", false); 
       intent.putExtra("isLocal", true); 
       intent.putExtra("videoUri", selectedImageUri.toString()); 
       /* Pair<View, String> imagePair = Pair 
         .create((View) viewHolder.getImageView(), transitionName);*/ 
       ActivityOptionsCompat options = ActivityOptionsCompat 
         .makeSceneTransitionAnimation(getActivity()); 
       ActivityCompat.startActivity(getActivity(), intent, options.toBundle()); 

      } 
     } 
    } 


    //get path of video fetched... 
    public String getPath(Uri uri) { 
     Log.d(TAG, "uri is " + uri); 
     String[] proj = {MediaStore.Images.Media.DATA}; 
     CursorLoader loader = new CursorLoader(getActivity(), uri, proj, null, null, null); 
     Cursor cursor = loader.loadInBackground(); 
     int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA); 
     cursor.moveToFirst(); 

     if (cursor.moveToFirst()) { 
      //int column_index1 = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);//Instead of "MediaStore.Images.Media.DATA" can be used "_data" 
      Uri filePathUri = Uri.parse(cursor.getString(column_index)); 
      String file_name = filePathUri.getLastPathSegment().toString(); 
      String file_path = filePathUri.getPath(); 
      localFileName = file_name; 
      localFilePath = file_path; 
      Toast.makeText(getActivity(), "File Name & PATH are:" + file_name + "\n" + file_path, Toast.LENGTH_LONG).show(); 
      Log.d("zz fileData: ", "fp: " + file_path + " :and: fn: " + file_name); 
     } 
     String result = cursor.getString(column_index); 
     cursor.close(); 
     return result; 
    } 

    @Override 
    public void onDetach() { 
     Toast.makeText(getActivity(), "VideoBrowserFragment onDetach", Toast.LENGTH_SHORT).show(); 
     Log.d(TAG, "VideoBrowserFragment onDetach"); 
     mCastManager.removeVideoCastConsumer(mCastConsumer); 
     super.onDetach(); 
    } 

    @Override 
    public void itemClicked(View view, MediaInfo item, int position) { 
     Toast.makeText(getActivity(), "VideoBrowserFragment itemClicked", Toast.LENGTH_SHORT).show(); 
     Log.d(TAG, "VideoBrowserFragment itemClicked"); 

     if (view instanceof ImageButton) { 
      Log.d(TAG, "menu was clicked"); 
      com.scriptlanes.cast2.utils.Utils.showQueuePopup(getActivity(), view, item); 
     } else { 
      String transitionName = getString(R.string.transition_image); 
      VideoListAdapter.ViewHolder viewHolder = 
        (VideoListAdapter.ViewHolder) mRecyclerView.findViewHolderForPosition(position); 
      Pair<View, String> imagePair = Pair 
        .create((View) viewHolder.getImageView(), transitionName); 
      ActivityOptionsCompat options = ActivityOptionsCompat 
        .makeSceneTransitionAnimation(getActivity(), imagePair); 

      Intent intent = new Intent(getActivity(), LocalPlayerActivity.class); 
      Log.d(TAG, "VideoBrowserFragment itemClicked media :" + Utils.mediaInfoToBundle(item)); 

      intent.putExtra("media", Utils.mediaInfoToBundle(item)); 
      intent.putExtra("shouldStart", false); 
      //isUrl=true, isLocal=false 
      intent.putExtra("isLocal", false); 
      ActivityCompat.startActivity(getActivity(), intent, options.toBundle()); 
     } 
    } 

    @Override 
    public Loader<List<MediaInfo>> onCreateLoader(int id, Bundle args) { 
     Toast.makeText(getActivity(), "VideoBrowserFragment onCreateLoader", Toast.LENGTH_SHORT).show(); 
     Log.d(TAG, "VideoBrowserFragment onCreateLoader"); 

     return new VideoItemLoader(getActivity(), CATALOG_URL); 
    } 

    @Override 
    public void onLoadFinished(Loader<List<MediaInfo>> loader, List<MediaInfo> data) { 
     Toast.makeText(getActivity(), "VideoBrowserFragment onLoadFinished", Toast.LENGTH_SHORT).show(); 
     Log.d(TAG, "VideoBrowserFragment onLoadFinished"); 
     mAdapter.setData(data); 
     mLoadingView.setVisibility(View.GONE); 
     mEmptyView.setVisibility(null == data || data.isEmpty() ? View.VISIBLE : View.GONE); 
    } 

    @Override 
    public void onLoaderReset(Loader<List<MediaInfo>> loader) { 
     Toast.makeText(getActivity(), "VideoBrowserFragment onLoaderReset", Toast.LENGTH_SHORT).show(); 
     Log.d(TAG, "VideoBrowserFragment onLoaderReset"); 
     mAdapter.setData(null); 
    } 



    /*temp code nanohttpd*/ 


    public class LocalServer extends NanoHTTPD { 

     private final Logger LOG = Logger.getLogger(LocalServer.class.getName()); 

     public void main(String[] args) { 
      ServerRunner.run(LocalServer.class); 
     } 
     public LocalServer() { 
      super(3000); 
      Log.d("zz nanaHttpd: ", "STARTED"); 

     } 

     @Override 
     public Response serve(String uri, Method method, Map<String, String> header, Map<String, String> parameters, Map<String, String> files) { 
      //String mediasend = getExtension(chosenFile); 

      Log.d("zz nanaHttpd: ", "uri: " + uri+" , method: "+method); 
      FileInputStream fis = null; 
      File file = new File(localFilePath); 
      Log.e("Creando imputStream", "Size: "); 
      try { 
       fis = new FileInputStream(file); 
      } catch (FileNotFoundException e) { 
       e.printStackTrace(); 
      } 

      return new NanoHTTPD.Response(Response.Status.OK, "video/mp4", fis); 
     } 

    } 

    private void startLocalServer() { 
     server = new LocalServer(); 
     try { 
      server.start(); 
     } catch (IOException ioe) { 
      Log.d("zz Httpd", "The server could not start."); 
     } 
     Log.d("zz Httpd", "Web server initialized."); 
     WifiManager wifiManager = (WifiManager) getActivity().getSystemService(Context.WIFI_SERVICE); 
     int ipAddress = wifiManager.getConnectionInfo().getIpAddress(); 
     Log.d("zz Httpd IP U: ", ipAddress + ""); 
     String formatedIpAddress1 = String.format("%d.%d.%d.%d", (ipAddress & 0xff), (ipAddress >> 8 & 0xff), 
       (ipAddress >> 16 & 0xff), (ipAddress >> 24 & 0xff)); 
     formatedIpAddress = "http://" + formatedIpAddress1 + ":" + server.getListeningPort(); 
     Log.d("zz Httpd IP: ", "Please access! " + formatedIpAddress); 


    } 

    @Override 
    public void onDestroy() { 
     super.onDestroy(); 
     //server.stop(); 
    } 
} 

答えて

0

あなたは他の記事で見てきたように、あなたはあなたのアプリケーションに埋め込まれたWebサーバーを追加し、そのウェブサーバでローカルのコンテンツを公開する必要があります。次に、これらのローカルコンテンツのURLをchromecastに送信する必要があります。多くのオープンソースの小型組み込みhttpサーバがあり、あなた自身の小さなhttpサーバを作成したくない場合に使用できます。そのような組み込みソリューションのためにgoogleすることができます。

+0

ありがとう@Ali Naddaf ....... "NanoHttpD"でローカルサーバーを作成しようとしましたが、選択したビデオ/画像のURLを渡す方法がわかりません。私は以下のことをしてきました:(1)ビデオファイルを選択するためのギャラリーを開き、onActivityResultを選択したビデオのURIを取得します。その後、私は何をしなければならないのですか? – pravin

+0

Ali Naddaf私はあなたのために私の全体のコードを追加して私の質問を更新しました.. "NanoHttpD"ローカルサーバーを通じて、選択したビデオファイルのURLを取得する方法を教えてください。 – pravin

関連する問題