• 締切済み

またお世話になります。android URI

なかなか私の頭で理解できるように全体的に紹介してるとこが見つからないのですが。 URIというものとコンテントプロバイダというのが、いったいどのような意味で相互に作用するのか まったくわからないのですが、ご説明願いますでしょうか(´_`;)よろしくお願いします

みんなの回答

noname#161640
noname#161640
回答No.1

ContentProviderというのは、アプリ間で情報共有を行うための仕組みです。また「どの情報にアクセスするか」を指定するのにURIが用いられます。URIは、単に「あるものの在り処(場所)を示すためのもの」に過ぎません。 例えば、住所録などの情報は、ひとつのアプリで使えればいいわけではなくて、さまざまなアプリから利用できるようになっているのが望ましいでしょう。が、これが「データを保管したファイルにアクセスする」という形だと、例えば同時に複数のアプリがアクセスしたりすることによりファイルを破損したり、片方が使用中でもう片方が使えないとかいろいろ不便が生じます。そもそもAndroidの多くのデータはデータベースに保管されているので、普通のファイルアクセスのような形では利用しづらいのです。 そこで、保管されている汎用的な情報を管理し供給するための専用の仕組みとしてContentProviderが用意されています。このContentProviderは、さまざまな情報を提供できるようになっているため、アプリからは「どの情報がほしいか」を指定してやらないといけません。これにURIが用いられています。つまり、URIを使って「この情報がほしい」というのを指定すると、ContentProviderがその情報を取り出してくれる、というわけです。 自分のアプリで、外部から利用できるようにする場合も、このContentProviderを使って、「このアプリの情報は、こういうURIで公開しますよ」ということを指定してやれば、外部からそのURIで取り出せるようになります。

dellx1
質問者

お礼

早い時間にありがとうございます。 ユニークな参照用の住所みたいなのがつけられるということですね? この質問をした理由が いま本を参考にカメラアプリを起動して画像を読み込むということをやってるんですが、、 普通に写真撮影されるフォルダに表示される画像と同じ絵は入ってますが、ファイルネームはこのプログラムで指定された名前とは関係なしにIMAG00x.jpgのようになっています。 このプログラム中で指定したファイル名は関係ないんでしょうか?・・ もしくは別の場所に同じ画像があるということでしょうか;また、toastでimageviewの幅や位置を取得しようとしてるのですが全部0に表示されてます。取得方法はありますでしょうか public class testt extends Activity { Uri mPictureUri; // インスタンス変数 /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); Button button1 = (Button) findViewById(R.id.menubutton1); button1.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { long dateTaken = System.currentTimeMillis(); String filename = "hogehoge" + System.currentTimeMillis() + ".jpg"; ContentValues values = new ContentValues(); values.put(MediaStore.Images.Media.TITLE, filename); values.put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg"); mPictureUri = getContentResolver().insert( MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values); Log.d("ss", filename); Intent intent = new Intent(); intent.setAction("android.media.action.IMAGE_CAPTURE"); intent.putExtra(MediaStore.EXTRA_OUTPUT, mPictureUri); startActivityForResult(intent, 1); } }); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { // super.onActivityResult(requestCode, resultCode, data); if (resultCode != RESULT_OK) { Log.d("ss", "sippairasii"); return; } if (requestCode == 1) { Log.d("ss", mPictureUri.getPath()); LinearLayout linearlayout =(LinearLayout)findViewById(R.id.layoutLoot); ImageView imageView = new ImageView(this); imageView.setImageURI(mPictureUri); linearlayout.addView(imageView); Toast.makeText(this, ""+imageView.getWidth()+";"+imageView.getHeight()+":"+imageView.getLeft(), Toast.LENGTH_LONG).show(); } }

関連するQ&A