Android触り始めました。さすがに初めてすぎて全然わかんない。

iOSと違ってAndroidでは公式ではないアプリが写真を削除できるらしいということでサンプルを書いてためしてみました。

下のコードでは

  1. ギャラリーを開いて
  2. 写真を選択して
  3. ContentResolver::deleteにURI渡しで削除
 1public class MainActivity extends ActionBarActivity {
 2
 3    @Override
 4    protected void onCreate(Bundle savedInstanceState) {
 5        super.onCreate(savedInstanceState);
 6        setContentView(R.layout.activity_main);
 7
 8        // ボタンクリックで写真選択へ
 9        Button b = (Button)findViewById(R.id.button_open);
10        b.setOnClickListener(new View.OnClickListener() {
11            @Override
12            public void onClick(View v) {
13                Intent intent = new Intent();
14                intent.setType("image/*");
15                intent.setAction(Intent.ACTION_PICK);
16                startActivityForResult(intent, 0);
17            }
18        });
19    }
20
21    @Override
22    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
23        if (requestCode == 0 && resultCode == RESULT_OK) {
24            try {
25                getContentResolver().delete(data.getData(), null, null);
26            } catch (Exception e){
27                Log.d("MainActivity", e.getMessage());
28            }
29        }
30    }
31}

でもこれだけでは削除は完了しません。

例外キャッチ時のメッセージを適当な"Fail"みたいなメッセージにしていたせいで全然気が付かなかったんですが、ちゃんと例外メッセージを出したらこんなん↓が出てました。

writing com.android.providers.media.MediaProvider uri content://media/external/images/media/1368
from pid=27267, uid=10071 requires android.permission.WRITE_EXTERNAL_STORAGE, or grantUriPermission()

パーミッションが足りないらしい。

ということでAndroidManifest.xmlにパーミッションに関して追記することで削除ができるようになりました。

1<?xml version="1.0" encoding="utf-8"?>
2<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com....." >
3    <application>
4        ...
5    </application>
6    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
7</manifest>

多分パーミッションの設定自体Android開発では当たり前のことなんでしょうね。誰も言及してないし。